从数据框中提取特定列


364

我有一个包含6列的R数据框,并且我想创建一个仅包含三列的新数据框。

假设我的数据帧df,我想提列ABE,这是唯一的命令,我可以计算出:

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

有没有更紧凑的方法可以做到这一点?

Answers:


156

如果您的data.frame被调用,则使用dplyrdf1

library(dplyr)

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

也可以在不使用%>%管道的情况下将其写为:

select(df1, A, B, E)

2
自从发布问题以来,Tidyverse有了长足的发展,我将答案转给了您。
阿伦·坎布雷

4
鉴于tidyverse的变化率很高,我谨告您不要使用这种模式。这是我强烈反对在为函数,程序包或应用程序编写代码时将列名视为对象名称的强烈偏爱。
约书亚·乌尔里希

1
自从提交答案以来已有四年多了,而且模式没有改变。管道表达式可以非常直观,这就是它们如此吸引人的原因。
阿伦·坎布雷

如何对该子集执行进一步的命令?例如,我想计算rowMean:“ df1%>%rowMeans(select(A,B,E))”不起作用。

你最好链在一起的管道,如:df1 %>% select(A, B, E) %>% rowMeans(.)。输入以下内容查看%>%管道的文档?magrittr::`%>%`
Sam Firke,

448

您可以使用列名称的向量作为子集。与将列名视为对象名(例如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")]

4
那给出了错误object of type 'closure' is not subsettable
阿伦·坎布雷

24
@ArenCambre:那么您的data.frame并没有真正命名dfdf也是stats软件包中的函数。
约书亚·乌尔里希


2
@Cina:因为-"A"是语法错误。并?Extract说,“ ,也可以是负整数,表明元素/切片离开选择了。” ij...
Joshua Ulrich 2015年

7
这种语法存在一个问题,因为如果我们仅提取R列,则返回向量而不是数据帧,并且这可能是不需要的:> df[,c("A")] [1] 1。使用subset没有这个缺点。
David Dorchies

100

这是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

当我用数据尝试此操作时,出现以下错误:“ x [j]中的错误:下标类型'list'无效”但是,如果c(“ A”,“ B”)不是列表,那是什么?
Rafael_Espericueta

@Rafael_Espericueta在不查看代码的情况下很难猜测...但这c("A", "B")是一个向量,而不是列表。
斯特凡·洛朗

它将数据帧转换为列表。
Suat Atan PhD

78

有两个明显的选择:约书亚·乌尔里希(Joshua Ulrich)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

16

仅出于某些原因

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

为我工作。以上所有语法均产生“未定义的列已选择”。



14

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

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

这给出了df1具有列A,B,E 的数据帧作为输出。




0

[ 和子集不可替代:

[ 如果仅选择一列,则不会返回向量。

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"))
)

4
如果您设置,则不会drop=FALSE。示例:df[,c("a"),drop=F]
直到
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.