【发布时间】:2020-03-21 19:57:53
【问题描述】:
我有一个按 id、start(一些 id 有多个起点)和年份排序的大约一百万行的数据集,并且想计算这两个变量的 5 年平均值(从 start-5 开始)(每个 id 中的 var1 和 var2)。
例如,var1 中的 5 年平均值为 243.2=(47+99+1000+60+10)/5 和 46=(133+13+88-50)/4(4 年平均值到期到数据范围限制)分别用于 id==1 和 id==2。下面的代码有什么快速的替代方法吗?
样本数据:
id start year var1 var2
1 2005 2000 500 333
1 2005 2001 10 444
1 2005 2002 60 555
1 2005 2003 1000 99
1 2005 2004 99 15
1 2005 2005 47 0
1 2005 2006 180 NA
2 2003 2000 -50 NA
2 2003 2001 88 17
2 2003 2002 13 77
2 2003 2003 133 55
2 2003 2004 86 30
2 2003 2005 10 100
代码:
# Find startpoint per id
idx <- which(year==start)
# Compute
sapply(idx, function(x){
with( dat, c(id[x],
start[x],
mean( var1[id==id[x] & (year>=max(2000,year[x]-4) & year<=year[x])], na.rm=T ),
mean( var2[id==id[x] & (year>=max(2000,year[x]-4) & year<=year[x])], na.rm=T )) )
})
基于以下公认解决方案的调整版本:
data <- setDT(data)[, .(var1_avg5 = mean(var1[year > start-5 & year <= start], na.rm = T),
var2_avg5 = mean(var2[year > start-5 & year <= start], na.rm = T),
start,
year),
by=id]
【问题讨论】:
-
你能添加一个示例数据吗?
-
是的,抱歉现在添加了。
-
@Rico, for id =1 为什么你从 2001 年开始到 2005 年而不是从 2000 年开始?同样对于 id=2 你有 6 年的数据,那么为什么只选择 4 年呢? (哪个数据限制?!)
标签: r performance indexing mean