大家好,新年快乐,我想知道data.table是否可以处理基于每个分组的select执行的更新。
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如果我想要更新每个by-group中的条件,我需要在j中执行select,但这更像是一个选择( 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[,':='(x=NULL,y=NULL,z=NULL)]的DT[drop="x,y,z"]
发布于 2013-01-08 06:15:32
这只是一个猜测,关注并建立在评论之上:which.max(x)可能比x==max(x)更快。
来自?which.max:
which.min和which.max的Value
长度为1或0的整数(当x没有非NAs),分别给出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+),并将键控与非键控进行比较。
https://stackoverflow.com/questions/14197987
复制相似问题