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
列。
我是 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
列。