在内部更新并删除

时间:2013-01-07 14:33:33

标签: r data.table

大家好,新年快乐, 我想知道data.table是否可以处理基于每个副组的选择执行的更新。

R) a=data.table(x=c("a","a","b","b","c","c"),y=c(1,2,3,3,2,1))
R) a
   x y
1: a 1
2: a 2
3: b 3
4: b 3
5: c 2
6: c 1

如果我想更新每个分组中的条件,我需要在j中进行选择,但这更像是i事物(选择)。

R) a[,c:=ifelse(y==max(y),"yes","no"),by=x]
R) a
   x y   c
1: a 1  no
2: a 2 yes
3: b 3 yes
4: b 3 yes
5: c 2 yes
6: c 1  no

我可以使用像a[y==max(y),c:="yes",by=x,within.by=TRUE]这样的选项来做同样的事情吗?我认为它会更快

第二个问题,它是否计划在data.table中获得一个drop参数,以便能够做到 DT[drop="x,y,z"]基本上是DT[,':='(x=NULL,y=NULL,z=NULL)]

1 个答案:

答案 0 :(得分:1)

这只是一个猜测,跟随并建立在评论之上:which.max(x)可能比x==max(x)更快。

来自?which.max

  

which.minwhich.max 的价值   长度为1或0的整数(iff x没有非NA),分别给出x的第一个最小值或最大值的索引。如果此极值是唯一的(或为空),则结果与which(x == min(x))which(x == max(x))分别相同(但效率更高)。

所以,可能是这样的:

DT[,c:="no"]
w = DT[,list(IDX=.I[which.max(y)]),by=x]$IDX
DT[w,c:="yes"]

使用i可能就是你所得到的。结果w每个组只有一个项目,而不是每个组.N,因此它也可能更快。不仅仅是which.max本身。但是,如果最大值可以绑定,那么which.max将只返回第一个,因此根据您的数据可能不合适。

如果您进行基准测试,请确保将数据设置为大(1GB +),并将键控比较为非键入。