首页 文章

从数据框中提取特定列

提问于
浏览
300

我有一个包含6列的R数据框,我想创建一个只有三列的新数据框 .

假设我的数据框是 df ,并且我想提取列 ABE ,这是我能找到的唯一命令:

data.frame(df$A,df$B,df$E)

有更紧凑的方式吗?

8 回答

  • 0

    有两个明显的选择:约书亚乌尔里希的 df[,c("A","B","E")]

    df[,c(1,2,5)]
    

    如在

    > df <- data.frame(A=c(1,2),B=c(3,4),C=c(5,6),D=c(7,7),E=c(8,8),F=c(9,9)) 
    > df
      A B C D E F
    1 1 3 5 7 8 9
    2 2 4 6 7 8 9
    > df[,c(1,2,5)]
      A B E
    1 1 3 8
    2 2 4 8
    > df[,c("A","B","E")]
      A B E
    1 1 3 8
    2 2 4 8
    
  • 86

    仅出于某种原因

    df[, (names(df) %in% c("A","B","E"))]
    

    为我工作 . 所有上述语法都产生了“未定义的列选择” .

  • 391

    再次使用dplyr,其中df1是您的原始数据框:

    df2 <- subset(df1, select = c(1, 2, 5))
    
  • 9

    使用dplyr包,如果您的data.frame被称为 df1

    library(dplyr)
    
    df1 %>%
      select(A, B, E)
    

    这也可以在没有 %>% 管道的情况下编写:

    select(df1, A, B, E)
    
  • 63

    [ 和子集不可替代:

    如果只选择了一列, [ 会返回一个向量 .

    df = data.frame(a="a",b="b")    
    
    identical(
      df[,c("a")], 
      subset(df,select="a")
    ) 
    
    identical(
      df[,c("a","b")],  
      subset(df,select=c("a","b"))
    )
    
  • 9

    这是subset()函数的作用:

    > dat <- data.frame(A=c(1,2),B=c(3,4),C=c(5,6),D=c(7,7),E=c(8,8),F=c(9,9)) 
    > subset(dat, select=c("A", "B"))
      A B
    1 1 3
    2 2 4
    
  • 10

    您可以使用列名称向量进行子集化 . 我非常喜欢这种方法,而不是那些将列名称视为对象名称(例如 subset() )的方法,尤其是在函数,包或应用程序中进行编程时 .

    # data for reproducible example
    # (and to avoid confusion from trying to subset `stats::df`)
    df <- setNames(data.frame(as.list(1:5)), LETTERS[1:5])
    # subset
    df[,c("A","B","E")]
    
  • 58

    您还可以使用 sqldf 包对R数据帧执行选择,如下所示:

    df1 <- sqldf("select A, B, E from df")
    

    这给出了一个数据帧 df1 ,其列为:A,B,E .

相关问题