我想找到列组中所有值的均值。给定的一组列可能包含缺失的观察值。我想用该组列的平均值替换一组列中缺失的观察值。在我的情况下,每组的列数是一个常数,years
.
下面是执行此操作的代码。但是,我希望有人可以提供更高效的代码。lapply
查找给定列组的平均值。但是,我还没有想出类似的方法来替换缺失的观察结果。谢谢你的任何建议。
这是一个示例数据集:
my.first.year <- 1980
my.last.year <- 1982
years <- (my.last.year - my.first.year) + 1
x = read.table(text = "
city county state a80 a81 a82 b80 b81 b82
1 B AA 2 20 200 4 8 12
2 B AA 4 NA 400 5 9 NA
1 C AA 6 60 NA NA 10 14
2 C AA NA 80 800 7 11 15
", sep = "", header = TRUE, stringsAsFactors = FALSE)
(2 + 4 + 6 + 20 + 60 + 80 + 200 + 400 + 800) / 9
(4 + 5 + 7 + 8 + 9 + 10 + 11 + 12 + 14 + 15) / 10
my.means <- lapply( seq(4, ncol(x), years) , function(i) { mean(unlist(x[,i : (i+years-1) ]) , na.rm=TRUE) } )
my.means
x2 <- x
x2[,(3+years*0+1):(3+years*1)][is.na(x2[,(3+years*0+1):(3+years*1)])] = my.means[[1]]
x2[,(3+years*1+1):(3+years*2)][is.na(x2[,(3+years*1+1):(3+years*2)])] = my.means[[2]]
结果如下:
# city county state a80 a81 a82 b80 b81 b82
# 1 1 B AA 2.0000 20.0000 200.0000 4.0 8 12.0
# 2 2 B AA 4.0000 174.6667 400.0000 5.0 9 9.5
# 3 1 C AA 6.0000 60.0000 174.6667 9.5 10 14.0
# 4 2 C AA 174.6667 80.0000 800.0000 7.0 11 15.0