首页 > 解决方案 > R 与 data.table 和 grep 子集列的奇怪行为

问题描述

我正在尝试为数据表的列子集构造 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

为什么会出现差异?

标签: rdata.tablesubset

解决方案


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

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


推荐阅读