2

大家好,新年快乐,我想知道是否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]我认为会快得多的选项来做同样的事情吗

第二个问题,它是否计划在 中进行 drop 参数data.table,能够做到 DT[drop="x,y,z"]这一点本质上是DT[,':='(x=NULL,y=NULL,z=NULL)]

4

1 回答 1

1

这只是一个猜测,关注并建立在评论之上:which.max(x)可能比x==max(x).

来自?which.max

which.min和的值which.max
长度为 1 或 0 的整数(仅当 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+),并将 keyed by 与 unkeyed by 进行比较。

于 2013-01-07T22:15:31.713 回答