大家好,新年快乐,
我想知道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)]
答案 0 :(得分:1)
这只是一个猜测,跟随并建立在评论之上:which.max(x)
可能比x==max(x)
更快。
来自?which.max
:
which.min
和which.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 +),并将键控比较为非键入。