【问题标题】:R strange behavior with data.table and grep subsetting columnsR 与 data.table 和 grep 子集列的奇怪行为
【发布时间】:2018-11-22 00:04:06
【问题描述】:

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

为什么会出现差异?

【问题讨论】:

    标签: r data.table subset


    【解决方案1】:
    minExample[ , grep("V", names(minExample)), with = FALSE]
    

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

    【讨论】:

    • 你能解释一下为什么需要“with”,或者参考文档部分来解释吗?为什么它适用于数据框而不适用于数据表?
    • @ProfessorE 查看 data.table 包文档中的第一个条目以及那里对with 参数的讨论。默认情况下,with=TRUE 表示j 位置中的表达式被视为 data.table 中的变量。如果您指定with=FALSE,那么您将它们视为列名的向量。在您的语法中,您为 j 位置提供了一个字符向量。这些是字符,而不是变量(在 data.table 中),因此无法识别。这与A=2 然后A+5 有效,但A=2"A" + 5 无效的原因相同。
    猜你喜欢
    • 2017-11-18
    • 1970-01-01
    • 1970-01-01
    • 2014-04-25
    • 1970-01-01
    • 2020-06-10
    • 2021-10-26
    • 2023-03-25
    • 2021-12-05
    相关资源
    最近更新 更多