【发布时间】:2015-11-11 19:51:25
【问题描述】:
更新 - 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中以迂回的方式记录:
单个列名,单个列名表达式,list() 列名表达式,计算结果为列表的表达式或函数调用(包括 data.frame 和 data.table,它们也是列表) , 或(当 with=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 在for 循环中遍历data.table 的多个列。
有什么建议吗?
【问题讨论】:
-
我猜你正在寻找这个:
dt[!is.na(3), sum(data), by = .(group1, group2)]。as.vector(!is.na(dt[, 3, with = F]))的部分使事情变得过于复杂。相反,您可以使用:!is.na(3) -
@Jaap,我认为他们想使用“3”而不是“数据”......
-
没错,我需要在 for 循环中对其进行迭代。真的有
data的多列。 -
@AnandaMahto 改了,但基本上是一样的。
-
您能解释一下预期的输出应该是什么吗?
标签: r data.table