列のグループ内のすべての値の平均を見つけたい。特定の列のグループには、欠落している観測値が含まれている可能性があります。列のグループ内の欠落している観測値を、その列のグループの平均に置き換えたいと思います。私の場合、グループあたりの列数は定数です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