更新 - 似乎with = F
与j
中的表达式以及(至少某些)by =
情境中的表达式不兼容。
采用以下方案并尽可能简化:
dt <- data.table(group1 = c("a", "a", "a", "b", "b", "b"),
group2 = c("x", "x", "y", "y", "z", "z"),
data = c(rep(T, 3), rep(F, 3)))
dt[
,
3,
with = F,
by = list(group1, group2)
]
data
1: TRUE
2: TRUE
3: TRUE
4: FALSE
5: FALSE
6: FALSE
>
dt[
,
data,
by = list(group1, group2)
]
group1 group2 data
1: a x TRUE
2: a x TRUE
3: a y TRUE
4: b y FALSE
5: b z FALSE
6: b z FALSE
>
表达式行为以?data.table
:
单个列名,列名的单个表达式,列名表达式的列表(),计算结果列表的表达式或函数调用(包括data.frame和data.table也是列表) ,或(当= = FALSE时)要选择的名称或位置向量。
我没有在文档中看到with = F
禁用by =
的任何文档,但似乎在这种情况下确实如此。
我遇到的问题是data.table使用或忽略by =
,具体取决于我是否使用with = F
。
library(data.table)
dt <- data.table(group1 = c("a", "a", "a", "b", "b", "b"),
group2 = c("x", "x", "y", "y", "z", "z"),
data = c(rep(T, 3), rep(F, 3)))
# without with = F
dt[
as.vector(!is.na(dt[, 3, with = F])),
sum(data),
by = list(group1, group2)
]
>
group1 group2 V1
1: a x 2
2: a y 1
3: b y 0
4: b z 0
# with = F
dt[
as.vector(!is.na(dt[, 3, with = F])),
sum(3),
with = F,
by = list(group1, group2)
]
>
data
1: TRUE
2: TRUE
3: TRUE
4: FALSE
5: FALSE
6: FALSE
我尝试使用数字向量和by =
的字符向量,但都不起作用。
sum()
是一个示例函数,当我在j
上不使用函数时,我有同样的基本问题。
最后,我需要使用with = F
在data.table
循环中迭代for
的多个列。
有什么建议吗?
答案 0 :(得分:3)
对于具有命名列的数据,一个好的经验法则是 - 永远不会使用列号 - 列有时会重新排列,这会使代码完全崩溃。当然,对于任何经验法则都有例外,但你需要证明你的案例值得例外,所以我认为现在不是这样。
所以,如果你输入了你要做的代码:
dt[!is.na(data), sum(data), by = .(group1, group2)]
如果你在变量中有列名,你可以这样做:
col = "data"
dt[!is.na(get(col)), sum(get(col)), by = .(group1, group2)]
至于将by
与with = FALSE
一起使用 - 该模式旨在与data.frame
兼容,后者没有by
参数,但即使您有对by
参数的支持,结果将是微不足道的,因为j-expression
将始终被解释为with = FALSE
模式中的完整列(就像在data.frame
中一样)。