【发布时间】:2014-12-18 16:51:58
【问题描述】:
这里的主要问题是如何在将函数应用于面板子集时避免循环。
我想要这样的数据:
id year w pdvw
1 1930 2 10
1 1940 3 15.5
1 1950 5 23.5
1 1960 7.5 27.5
1 1970 11 NA
1 1980 9 NA
2 1930 NA NA
2 1940 NA NA
2 1950 1 10
2 1960 3 17
2 1970 6 NA
2 1980 8 NA
实际数据要多得多,而且稍微复杂一些。我正在尝试从其他列中生成最后一列(pdvw)。 pdvw 是 w 的下一个(及时)三个条目的总和(例如 pdvw[1] = 2+3+5)。我很容易写
for(t in seq(from=1930,to=1960,by=10)){
for(i in c(1,2)){
if(is.na(w[id==i & t==year])==FALSE){
pdvw[id==i & year==t] = sum(w[id==i & t<=year & year<=t+21])
}
}
}
我的应用程序不是很大(年份为 20 个值,id 为 150 个值),但我被告知要尽可能避免此类循环,所以我想看看是否有更好的方法。我不太关心多年来避免循环,因为 20 次迭代可以忽略不计,但我确实想学习成为更好的编码器。我认为 by 可能会有所帮助,但我不确定具体是什么。
我上面的解决方案利用(可能很危险)这样一个事实,即 w 的缺失值永远不会出现在非缺失值之前(仅仅是历史的巧合——因此,“可能是危险的”)。我包括了缺失值,因为任何解决方案都可以处理这样一个事实,即一旦给定面板的数据可用,就必须开始 pdvw 计算,这一点很重要。
【问题讨论】:
-
可能有用Q&A