【问题标题】:data.table: calculation condition on presence of value within groupdata.table:组内值存在的计算条件
【发布时间】:2019-11-28 17:46:12
【问题描述】:

有一些数据

library(data.table); set.seed(42)
dat <- data.table(id=1:5, group=c(1,1,1,2,2), time=c(1,2,3,1,2), val=runif(5))
> dat
   id group time       val
1:  1     1    1 0.9148060
2:  2     1    2 0.9370754
3:  3     1    3 0.2861395
4:  4     2    1 0.8304476
5:  5     2    2 0.6417455

我想对时间点 2 应用一些计算,例如 val*2,仅适用于没有第三个时间点的组。因此预期的输出是

> res
   id group time       val
1:  1     1    1 0.9148060
2:  2     1    2 0.9370754
3:  3     1    3 0.2861395
4:  4     2    1 0.8304476
5:  5     2    2 1.2834910

第 2 组中时间 2 的值已更改。 我怀疑它类似于

dat[,val:=val[max(time)==2]*2, by=group]

但这行不通。因为我想将计算应用到与我正在设置子集的时间点不同的时间点,所以我觉得这不能在 i 中完成,但我不知道该怎么做。

【问题讨论】:

  • 能否请您添加一个包含您预期结果的列?我不确定我明白了。

标签: r data.table


【解决方案1】:

像这样:

dat[, val := val*(1 + (time==2 & max(time)==2)), by=group]
##    id group time       val
## 1:  1     1    1 0.9148060
## 2:  2     1    2 0.9370754
## 3:  3     1    3 0.2861395
## 4:  4     2    1 0.8304476
## 5:  5     2    2 1.2834910

【讨论】:

  • 优雅,谢谢!然而,val*2只是一个例子。我需要一个更通用的解决方案。
【解决方案2】:

根据我之前的回答(编辑前)和@Axeman 的回答,您可以执行以下操作

dat[, val2 := if(max(time) == 2) ifelse(time==2, 2*val, val) else val, group][]
##     id group time       val      val2
##  1:  1     1    1 0.9148060 0.9148060
##  2:  2     1    2 0.9370754 0.9370754
##  3:  3     1    3 0.2861395 0.2861395
##  4:  4     2    1 0.8304476 0.8304476
##  5:  5     2    2 0.6417455 1.2834910

并用您想要的任何函数替换2*val

【讨论】:

  • 也许他们想要dat[, .(id, time, val, val2 = if(max(time) == 2) 2 * val else val), group]
  • 呼,也许吧!我将等待@bumblebee 编辑他/她的问题,之后我会编辑我的答案
  • 感谢你们! @Axeman 更接近我正在寻找的内容(添加了所需的输出),并且无论我已经了解到 if(.) 可以在 data.table 中使用的解决方案如何。
  • @J.P.LeCavalier 上面另一个答案中的解决方案得到了正确的结果,但对val*2 计算非常具体。您的解决方案是否可以修改以产生更通用的解决方案?
【解决方案3】:

数据是按时间排序的,所以我们可以加入每个组的最后一行并在它符合条件时进行编辑:

dat[.(unique(group)), on=.(group), mult="last", 
  val := if (time == 2) val*2 else val
, by=.EACHI]

我们可以使用if/else,因为mult="last"(和nomatch=NA)保证time的长度为1。(这与其他两个答案形成对比,其中每个组的全时向量已处理。)

【讨论】:

    猜你喜欢
    • 2016-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-21
    • 1970-01-01
    • 2015-03-08
    • 2014-08-09
    相关资源
    最近更新 更多