R 需要data.table方法按组使用滞后计算值

R 需要data.table方法按组使用滞后计算值,r,data.table,R,Data.table,样本数据: > DT <- data.table(yr=rep(1:4,2), grp=sort(rep(c('a','b'),4)), val=c(25,20,NA,NA,10,12,NA,NA)) > DT yr grp val 1: 1 a 25 2: 2 a 20 3: 3 a NA 4: 4 a NA 5: 1 b 10 6: 2 b 12 7: 3 b NA 8: 4 b NA 我宁愿避免循环,

样本数据:

> DT <- data.table(yr=rep(1:4,2), grp=sort(rep(c('a','b'),4)), val=c(25,20,NA,NA,10,12,NA,NA))
> DT
   yr grp val
1:  1   a  25
2:  2   a  20
3:  3   a  NA
4:  4   a  NA
5:  1   b  10
6:  2   b  12
7:  3   b  NA
8:  4   b  NA
我宁愿避免循环,因为我的实际数据非常大。

这里有一个选项

library(data.table)
DT[, val2 := val/2, grp]
DT[, val2 := replace(val2, is.na(val2),
   last(na.omit(val2))/2^(seq_len(sum(is.na(val2))))), grp]
-输出

DT
#   yr grp val val2
#1:  1   a  25 12.5
#2:  2   a  20 10.0
#3:  3   a  NA  5.0
#4:  4   a  NA  2.5
#5:  1   b  10  5.0
#6:  2   b  12  6.0
#7:  3   b  NA  3.0
#8:  4   b  NA  1.5
 
这里有一个选择

library(data.table)
DT[, val2 := val/2, grp]
DT[, val2 := replace(val2, is.na(val2),
   last(na.omit(val2))/2^(seq_len(sum(is.na(val2))))), grp]
-输出

DT
#   yr grp val val2
#1:  1   a  25 12.5
#2:  2   a  20 10.0
#3:  3   a  NA  5.0
#4:  4   a  NA  2.5
#5:  1   b  10  5.0
#6:  2   b  12  6.0
#7:  3   b  NA  3.0
#8:  4   b  NA  1.5
 

这太完美了。有一个问题,从技术上讲,分组是yr和grp(不仅仅是grp)。因为数据已经排序了,所以这样做有效吗?在未排序的数据表(yr和grp)中需要进行哪些修改(如果有)?@jsirgo
yr
grp
是相互对立的。不能同时按两者分组。如果您这样做,那么您将把每一行作为一个组。您的数据不需要排序。代码仍然可以很好地工作。如果
val2
的值并不总是
0.5*val
,而是
x*val
,其中
x
是另一列,具有多种值,该怎么办?这很完美。有一个问题,从技术上讲,分组是yr和grp(不仅仅是grp)。因为数据已经排序了,所以这样做有效吗?在未排序的数据表(yr和grp)中需要进行哪些修改(如果有)?@jsirgo
yr
grp
是相互对立的。不能同时按两者分组。如果您这样做,那么您将把每一行作为一个组。您的数据不需要排序。代码仍然可以很好地工作。如果
val2
的值并不总是
0.5*val
而是
x*val
的值,其中
x
是另一个具有各种值的列,该怎么办?