r - 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
为什么会出现差异?
解决方案
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
无效。
推荐阅读
- nlp - NLP:解决块中的共指代词
- microsoft-translator - 如何使用 MicrosoftTranslatorWidget 按当前位置语言翻译页面
- java - 在 Java 中读取 little-endian 64 位浮点数
- mysql - Sumif 与来自不同表的日期条件
- html - 在窗口内放大/缩小会导致图像重复
- javascript - 如何使用 Jquery 在 Modal 中调用局部视图
- jquery - 使用 JQuery 在 MVC 中检查时如何获取复选框值?
- hadoop - 无法在 HBase 中获取副本 0 的位置
- processing - 如何在圆加工中创建积分系统?
- r - 已编辑:如何为 PostHoc Tukey 测试和多重比较编写循环