R - 使用向量列表中的名称的子集数据帧列

时间:2016-09-14 18:53:06

标签: r dataframe

是否可以使用存储在列名称数组中的列名来对数据框列(到新的df)进行子集化 - 例如c(" col1"," col9",& #34; COL6&#34)?我知道我可以使用df [[colname]]语法在df中引用一列,但它不允许我为多列执行此操作:

df
   X1 X2 X3
1:  a  1  3
2:  b  5  3
3:  a  3  4
4:  c  6  5
5:  c  2  2

cnm<-c("X2","X3")

df[[cnm]]
  

.subset2(x,i,exact = exact)中的错误:下标越界

感谢

1 个答案:

答案 0 :(得分:3)

基于OP的数据集,它看起来像data.table。对于data.table中的列的子集,我们需要with = FALSE

df[, cnm, with = FALSE]
#   X2 X3
#1:  1  3
#2:  5  3
#3:  3  4
#4:  6  5
#5:  2  2

根据?data.table文档

  

with - 默认情况下为= TRUE,j在x的帧内进行计算;   列名可以用作变量。

     

当= = FALSE时,j是列名的字符向量,数字   列位置向量选择或形式startcol:endcol,   并且返回的值始终是data.table。通常为= FALSE   在data.table中有用,可以动态选择列。注意x [,   cols,with = FALSE]相当于x [,。SD,.SDcols = cols]。

如果数据集为data.frame,则为

setDF(df)#convert to 'data.frame'
df[cnm]
#   X2 X3
#1  1  3
#2  5  3
#3  3  4
#4  6  5
#5  2  2

将对数据集进行子集化

[[用于提取data.framelist元素的单列

data.table中应用OP代码会收到相同的错误消息

df[[cnm]]
  

.subset2(x,i,exact = exact)中的错误:下标越界

如果我们在data.table中执行data.frame子集化选项,它将无法正常工作

df[cnm]
  

[.data.table(df,cnm)中的错误:当我是data.table(或   字符向量),必须指定要连接的列   使用&#39; on =&#39;参数(参见?data.table)或通过键入x(即排序,   并标记为已排序,请参阅?setkey)。键控连接可能会更进一步   由于x在RAM中排序,因此速度对非常大的数据有益。