我希望能够将"return"列中的NA
值替换为相邻非缺失值的平均值,按"id"分组。假设一年中只有两个月:1月和2月。
df <- data.frame(id = c("A","A","A","A","B","B","B","B"),
year = c(2014,2014,2015,2015),
month = c(1, 2),
marketcap = c(4,6,2,6,23,2,5,34),
return = c(NA,0.23,0.2,0.1,0.4,0.9,NA,0.6))
df1
id year month marketcap return
1: A 2014 1 4 NA # <-
2: A 2014 2 6 0.23
3: A 2015 1 2 0.20
4: A 2015 2 6 0.10
5: B 2014 1 23 0.40
6: B 2014 2 2 0.90
7: B 2015 1 5 NA # <-
8: B 2015 2 34 0.60
期望的数据
desired_df <- data.frame(id = c("A","A","A","A","B","B","B","B"),
year = c(2014,2014,2015,2015),
month = c(1,2),
marketcap = c(4,6,2,6,23,2,5,34),
return = c(0.23,0.23,0.2,0.1,0.4,0.9,0.75,0.6))
desired_df
id year month marketcap return
1 A 2014 1 4 0.23 # <-
2 A 2014 2 6 0.23
3 A 2015 1 2 0.20
4 A 2015 2 6 0.10
5 B 2014 1 23 0.40
6 B 2014 2 2 0.90
7 B 2015 1 5 0.75 # <-
8 B 2015 2 34 0.60
第二个NA(第7行)应该被前后数值的平均值所取代,即(0.9 + 0.6)/2 = 0.75。
请注意,第一个NA(第1行)没有先前的数据。在这种情况下,NA应该被下一个非缺失值所取代,即0.23("向后填充最后一个观测值")。
如果可能的话,建议使用data.table解决方案。
更新: 当使用以下代码结构(对示例有效)时:
df[,returnInterpolate:=na.approx(return,rule=2), by=id]
我遇到了错误: 在approx(x[!na], y[!na], xout, ...)中发生了错误: 需要至少两个非NA值进行插值
我猜可能有一些ID没有非NA值可以进行插值。有什么建议吗?