复杂的data.table子集和操作

时间:2016-01-22 22:38:59

标签: r loops row data.table subset

我正在尝试将大量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)]

1 个答案:

答案 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