data.table 在链中使用时拒绝创建新列

data.table rejects to create new column when used in a chain

我是 data.table packcage 的新手,对其链接行为感到困惑。假设我们有以下代码:

aa <- data.table(a=c(1,2,3), b = c("a","b","b"))
aa[order(a,b)][,c:=cumsum(a), by=.(b)]
> aa
   a b
1: 1 a
2: 2 b
3: 3 b

未创建列 c

但是如果我们单独编写代码而不链接,可以生成c

aa <- data.table(a=c(1,2,3), b = c("a","b","b"))
aa[order(a,b)]
   a b
1: 1 a
2: 2 b
3: 3 b
aa[,c:=cumsum(a), by=.(b)]
> aa
   a b c
1: 1 a 1
2: 2 b 2
3: 3 b 5

那么为什么会这样呢?如何使用data.table正确编写链码?

非常感谢!

下面是新的

我注意到,如果我们将它分配给一个新的数据框,它又可以工作了:

aa <- data.table(a=c(1,2,3), b = c("a","b","b"))
bb <- aa[order(a,b)][,c:=cumsum(a), by=.(b)]
> bb
   a b c
1: 1 a 1
2: 2 b 2
3: 3 b 5

注意顺序。你可以试试

aa[,c:=cumsum(a), by=.(b)][order(a,b)]

这一行aa[order(a,b)][,c:=cumsum(a), by=.(b)],可以看成tmp <- aa[order(a,b)], tmp[,c:=cumsum(a), by=.(b)]。如果您 运行 aa[order(a,b)][,c:=cumsum(a), by=.(b)][] 进行检查,则 c 列确实已创建但不是原始 aa 列。