R 数据表:组内存在值的计算条件

R 数据表:组内存在值的计算条件,r,data.table,R,Data.table,有一些数据 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

有一些数据

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组中时间2的值发生了变化。 我怀疑这是类似于

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

但这是行不通的。因为我想将计算应用到一个不同的时间点,而不是我正在细分的时间点,我觉得这不能在
I
中完成,但我不知道如何做。根据我之前的答案(编辑前)和@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[,val:=val*(1+(时间==2&max(时间==2)),by=group]
##id组时间值
## 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

数据是按时间排序的,因此我们可以加入每个组的最后一行,并在其满足条件时进行编辑:

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

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

您能添加一列,列出您的预期结果吗?我不确定我是否明白。也许他们想要
dat[,(id,time,val,val2=if(max(time)==2)2*val else val),group]
?呼,也许!我会等@bumblebee编辑他/她的问题,我会在谢谢你们之后编辑我的答案@Axeman更接近我所寻找的(添加了期望的输出),并且不管我已经了解到的解决方案是什么,如果(.)
可以在data.table.@J.P.LeCavalier内使用,则上面的另一个答案中的解决方案会得到正确的结果,但非常特定于
val*2
计算。您的解决方案是否可以修改以生成更通用的解决方案?非常好,谢谢!然而,
val*2
仅仅是一个例子。我需要一个更普遍的解决方案。
dat[.(unique(group)), on=.(group), mult="last", 
  val := if (time == 2) val*2 else val
, by=.EACHI]