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)中需要进行哪些修改(如果有)?@jsirgoyr
和grp
是相互对立的。不能同时按两者分组。如果您这样做,那么您将把每一行作为一个组。您的数据不需要排序。代码仍然可以很好地工作。如果val2
的值并不总是0.5*val
而是x*val
的值,其中x
是另一个具有各种值的列,该怎么办?