我在data.table
中有以下R
:
library(data.table)
DT = data.table(x=rep(c("b","a","c"),each=3), y=sample(rnorm(9)), v=1:9)
我只想按列x
计算最小值和最大值,并将这两个新列添加到DT
。以下是我的意见:
DT[,c("e","d"):= list(min(y),max(y)), with=FALSE, by = x]
Error in `[.data.table`(DT, , `:=`(c("e", "d"), list(min(y), max(y))), :
'with' must be TRUE when 'by' or 'keyby' is provided
尽管如此,如果我写:DT[,c("e","d"):= list(min(y),max(y)), with=FALSE]
,我明白了:
x y v e d
1: a -1.7125000 4 -1.7125 1.30553
2: a 1.0198038 5 -1.7125 1.30553
3: a 1.3055301 6 -1.7125 1.30553
4: b -0.9238759 1 -1.7125 1.30553
5: b 0.3077016 2 -1.7125 1.30553
6: b -1.2580845 3 -1.7125 1.30553
7: c -0.9399120 7 -1.7125 1.30553
8: c -0.1910583 8 -1.7125 1.30553
9: c 0.1239158 9 -1.7125 1.30553
正如您所看到的,这是有效的,但它不是由x
执行任务。我想获得类似的东西,但e
和d
应该由变量x
的每个值计算。所以,我的问题是:我该如何解决这个问题?
答案 0 :(得分:4)
“:=
按组”(1.8.2版中的新功能)和“:=
多个新列”(1.7.8版中的新功能)都是数据的新增功能。表即可。
具有多个新列的组的:=
“尚未(尚未)实施。
所以现在,你可以这样做(如果你想要一个单行):
setkey(DT, "x")
DT <- DT[DT[,list(e=min(y), d=max(y)), by=key(DT)]]
或者这个(如果你想减少额外的复制操作):
setkey(DT, "x")
DT[,e:=min(y), by=key(DT)]
DT[,d:=max(y), by=key(DT)]
答案 1 :(得分:3)
这是语法。 DT
必须x
作为其工作的关键。
DT = data.table(x=rep(c("b","a","c"),each=3), y=sample(rnorm(9)), v=1:9)
setkey(DT, x)
DT[DT[, list(e=min(y), d=max(y)), by=x]]
x y v e d
1: a 0.04583602 4 -0.08423764 0.5778324
2: a 0.57783240 5 -0.08423764 0.5778324
3: a -0.08423764 6 -0.08423764 0.5778324
4: b -1.30934873 1 -1.30934873 0.3071819
5: b -0.05972203 2 -1.30934873 0.3071819
6: b 0.30718188 3 -1.30934873 0.3071819
7: c -0.72347616 7 -0.72347616 0.7800817
8: c -0.46930825 8 -0.72347616 0.7800817
9: c 0.78008168 9 -0.72347616 0.7800817