选择数据列时的奇怪行为.仅当string直接给定时有效,而不是作为变量



我想在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

最新更新