【问题标题】:Complex data.table subset and manipulation复杂的data.table子集和操作
【发布时间】:2016-01-22 22:38:58
【问题描述】:

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

【问题讨论】:

  • 你尝试过的“尴尬”尝试是什么?

标签: r loops row data.table subset


【解决方案1】:

链式版本可以如下所示,无需设置表键:

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

【讨论】:

  • @jangorecki,谢谢!编码是关于平衡性能和风格:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-15
  • 1970-01-01
  • 2011-11-13
  • 2015-09-13
相关资源
最近更新 更多