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]