我想在data.frame
/data.table
中选择一些列。然而,似乎有一个奇怪的行为:
创建虚拟数据:
df=data.frame(col1=c(1,2),col2=c(11,22),col3=c(111,222))
我们的data.frame
看起来像
col1 col2 col3
1 1 11 111
2 2 22 222
现在我为列名定义一些变量:
col1='col1'
col2='col2'
所以df[,c(col1,col2)]
和df[,c('col1','col2')]
的结果都是
col1 col2
1 1 11
2 2 22
然而,如果我对data.table
(由df=data.table(df)
创建)做同样的操作
col1 col2 col3
1: 1 11 111
2: 2 22 222
奇怪的事情发生了。df[,c('col1','col2')]
仍然得到正确的结果:
col1 col2
1: 1 11
2: 2 22
但是df[,c(col1,col2)]
不再工作了:
[1] 1 2 11 22
为什么?
这不是一个奇怪的行为,因为它已经在文档中提到了-with = FALSE
df[, c(col1, col2), with = FALSE]
与产出
col1 col2
1: 1 11
2: 2 22
根据?data.table
当with=TRUE(默认)时,j在data.table的框架内求值;也就是说,它将列名视为变量。这不仅可以选择j中的列,还可以对它们进行计算,例如,x[, a]和x[, sum(a)]分别返回x$a和sum(x$a)作为向量。X [, .(a, b)]和X [, .(sa=sum(a), sb=sum(b))]返回两列数据。每个表,第一个简单地选择列a, b,第二个计算它们的和。
其他选项为
df[, .(col1, col2)]
col1 col2
1: 1 11
2: 2 22
df[, .SD, .SDcols = c(col1, col2)]
col1 col2
1: 1 11
2: 2 22