我正在尝试将大量data.table操作组合成一些更快的代码。我正在创建一个具有较小data.table的示例,我希望有人比我开发的笨重(令人尴尬)的代码有更好的解决方案。
对于每个小组,我想:
1)确认列w中存在TRUE和FALSE,如果存在:
2)从每个中减去对应于v的最高值的x的值 x在同一组中的值,并将该数字放在新列中
因此在第3组中,如果最高v值为10,并且在同一行x中为0.212, 我会从对应于第3组的每个x值中减去0.212,并将该数字放在一个新列中
3)删除对应于组的所有行,同时在w列中没有TRUE和FALSE。
set.seed(1)
test <- data.table(v=1:12, w=runif(12)<0.5, x=runif(12),
y=sample(2,12,replace=TRUE), z=sample(letters[1:3],12,replace=TRUE) )
setkey(test,y,z)
test[,group:=.GRP,by=key(test)]
答案 0 :(得分:4)
链式版本看起来像这样,无需设置表键:
result <- test[
# First, identify groups to remove and store in 'rowselect'
, rowselect := (0 < sum(w) & sum(w) < .N)
, by = .(y,z)][
# Select only the rows that we need
rowselect == TRUE][
# get rid of the temp column
, rowselect := NULL][
# create a new column 'u' to store the values
, u := x - x[max(v) == v]
, by = .(y,z)]
结果如下:
> result
v w x y z u
1: 1 TRUE 0.6870228 1 c 0.4748803
2: 3 FALSE 0.7698414 1 c 0.5576989
3: 7 FALSE 0.3800352 1 c 0.1678927
4: 10 TRUE 0.2121425 1 c 0.0000000
5: 8 FALSE 0.7774452 2 b 0.6518901
6: 12 TRUE 0.1255551 2 b 0.0000000