使用data.table和grep子集列的R奇怪行为

时间:2018-06-12 14:33:00

标签: grep data.table subset

我正在尝试为数据表的列子集构造rowMeans。如果使用数据帧,代码可以工作,但不能作为数据表。为什么?

最小示例 - 下面的代码不会产生10x10输出:

IDnum <- c(101:110)
Name <- LETTERS[seq( from = 1, to = 10 )]
minExample <- as.data.table(replicate(10,sample(0:5,10,rep=TRUE)))
minExample <- cbind(IDnum, Name, minExample)
grep("V",names(minExample))
#-- Intermediate output omitted

minExample[ , grep("V", names(minExample))]
[1]  3  4  5  6  7  8  9 10 11 12

但这确实产生了正确的(10x10)输出:

minExample[ , 3:12]

但是,再次转换为数据框会产生预期的行为:

minExample2 <- as.data.frame(minExample)
grep("V", names(minExample2))
minExample2[ , grep("V",names(minExample2))]

Row V1 V2 V3 V4 V5 V6 V7 V8 V9  V10
1   2  3  5  5  1  3  2  1  3   1
2   4  3  0  1  5  3  0  5  2   3
3   1  2  0  2  2  4  4  0  4   0
4   3  4  5  4  0  0  2  0  0   3
5   2  2  4  4  5  2  1  4  2   2
6   5  3  3  1  1  2  0  5  1   4
7   4  2  2  0  3  1  4  0  5   1
8   0  4  3  2  2  2  2  0  3   5
9   4  3  3  5  4  1  2  0  5   0
10  5  5  0  3  4  4  0  0  1   5

为什么会出现差异?

1 个答案:

答案 0 :(得分:0)

minExample[ , grep("V", names(minExample)), with = FALSE]

至于为什么会出现这种情况,请查看data.table包文档中的第一个条目以及有关参数的讨论。默认情况下,with=TRUE表示j位置的表达式被视为data.table中的变量。如果指定with=FALSE,则将它们视为列名称的向量。在语法中,您为j位置提供了一个字符向量。这些是字符,而不是变量(在data.table中),因此它们不被识别。这与A=2然后A+5有效的原因相同,但A=2"A" + 5没有。