1

昨日、データセットの隣接する列の観測値の平均を取得する方法を尋ねる質問を投稿しました。

Rの列の平均ペア

今日、私は実際に加重平均が必要であることに気づきました。上記の答えを修正された状況に修正しようとしましたが、それでも、適用関数のファミリーを十分に理解していないため、簡単に修正できません。

以下のサンプルデータセットの加重平均を取得するコードを記述しました。おそらく、そのコードを実際のデータで使用できます。それでも、加重平均のためにここで関数の適用ファミリを使用する方法を誰かが説明できれば、それは私の理解とコーディングの習熟度の向上に大いに役立つと思います。とにかく、過去と未来のすべての助けとアイデアに感謝します。

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
4

2 に答える 2

1

前の質問に対する回答の要素を使用する:

numerator <- sapply(seq(2,ncol(x.weights),2), function(i) {
  apply(x.weights[,c(i, i+1)], 1, sum, na.rm=T)
})

denominator <- sapply(seq(2,ncol(weights),2), function(i) {
  apply(weights[,c(i, i+1)], 1, sum, na.rm=T)
})

numerator/denominator
于 2012-12-07T06:43:25.553 に答える
0
 apply(x, 1, function(rw) weighted.mean( rw[2:5], 
                     weights=weights[rw["site"], 2:5 ] ,na.rm=TRUE) )
[1]   9.750000  25.000000   3.333333 100.000000

これは、row.namesに一致するサイト番号に依存します。

于 2012-12-07T02:54:13.390 に答える