昨日、データセットの隣接する列の観測値の平均を取得する方法を尋ねる質問を投稿しました。
今日、私は実際に加重平均が必要であることに気づきました。上記の答えを修正された状況に修正しようとしましたが、それでも、適用関数のファミリーを十分に理解していないため、簡単に修正できません。
以下のサンプルデータセットの加重平均を取得するコードを記述しました。おそらく、そのコードを実際のデータで使用できます。それでも、加重平均のためにここで関数の適用ファミリを使用する方法を誰かが説明できれば、それは私の理解とコーディングの習熟度の向上に大いに役立つと思います。とにかく、過去と未来のすべての助けとアイデアに感謝します。
x = read.table(text = "
site yr1 yr2 yr3 yr4
1 10 15 6 8
2 10 20 30 40
3 5 NA 2 3
4 100 100 NA NA",
sep = "", header = TRUE)
x
weights = read.table(text = "
site yr1 yr2 yr3 yr4
1 2 4 1 3
2 2 2 4 2
3 3 2 2 3
4 4 2 2 4",
sep = "", header = TRUE)
weights
x.weights = x * weights
numerator <- matrix(NA, ncol=((ncol(x.weights)/2)+1), nrow=nrow(x.weights))
for(i in 1: ((ncol(weights)-1)/2)) {
for(j in 1: nrow(weights) ) {
numerator[j, 1 ] <- x[j,1]
numerator[j,(i+1)] <- sum(c(x.weights[j,(1 + ((i-1)*2 + 1))], x.weights[j,(1 + ((i-1)*2 + 2))]), na.rm = TRUE)
}
}
numerator
denominator <- matrix(NA, ncol=((ncol(weights)/2)+1), nrow=nrow(weights))
for(i in 1: ((ncol(weights)-1)/2)) {
for(j in 1: nrow(weights) ) {
denominator[j, 1 ] <- x[j,1]
denominator[j,(i+1)] <- sum(c(weights[j,(1 + ((i-1)*2 + 1))], weights[j,(1 + ((i-1)*2 + 2))]), na.rm = TRUE)
}
}
denominator
weighted.ave <- numerator[,2:ncol(numerator)] / denominator[,2:ncol(denominator)]
weighted.ave
# insert value from x if one of a pair is missing
# insert NA if both in a pair are missing
adj.weighted.ave <- weighted.ave
for(i in 1: ((ncol(x)-1)/2)) {
for(j in 1: nrow(x) ) {
if( is.na(x[j,(1 + (i-1)*2 + 1)]) & !is.na(x[j,(1 + (i-1)*2 + 2)])) adj.weighted.ave[j,i] = sum(c(x[j,(1 + ((i-1)*2 + 1))], x[j,(1 + ((i-1)*2 + 2))]), na.rm = TRUE)
if(!is.na(x[j,(1 + (i-1)*2 + 1)]) & is.na(x[j,(1 + (i-1)*2 + 2)])) adj.weighted.ave[j,i] = sum(c(x[j,(1 + ((i-1)*2 + 1))], x[j,(1 + ((i-1)*2 + 2))]), na.rm = TRUE)
if( is.na(x[j,(1 + (i-1)*2 + 1)]) & is.na(x[j,(1 + (i-1)*2 + 2)])) adj.weighted.ave[j,i] = NA
}
}
adj.weighted.ave
# [,1] [,2]
# [1,] 13.33333 7.50000
# [2,] 15.00000 33.33333
# [3,] 5.00000 2.60000
# [4,] 100.00000 NA