5

次のデータセット (実際のデータの単純なバージョン) 'data' があり、変数 x1 と x2 の加重平均を計算したいと思います。重み付け w1 と w2 をそれぞれ使用して、2 つのグループ (変数 n によって決定されるグループ) に分割します。 )。

data <- data.frame(n = c(1,1,1,2,2,2), x1 = c(4,5,4,7,5,5), x2 = c(7,10,9,NaN,11,12), w1 = c(0,1,1,1,1,1), w2 = c(1,1,1,0,0,1))

with() を使用して実行しようとしていますが、これを実行するとエラーが発生します。

with(data, aggregate(x = list(x1=x1, x2=x2), by = list(n = n), FUN = weighted.mean, w = list(w1 = w1,w2 = w2)))

一方、重みが指定されていない場合は機能しますが、この場合はデフォルトのレベルの重みが使用されます (つまり、FUN=mean を使用するのと同じです)。

with(data, aggregate(x = list(x1=x1, x2=x2), by = list(n = n), FUN = weighted.mean))

この質問は、グループと列による加重平均に似ていますが、私の質問には列ごとに異なる重みが含まれている点が異なります。データ テーブルを使用してみましたが、with() と同じ重み付けエラーが発生します。助けてくれてありがとう。

4

2 に答える 2

9

試す

library(data.table)
setDT(data)[, .(x1=weighted.mean(x1, w1), x2=weighted.mean(x2, w2)) , by = n]

または、@thelatemail がコメントしたようにMap、対応する「w」列の「x」をループして、単一の呼び出しで呼び出すことができます。weighted.mean

setDT(data)[, Map(weighted.mean, list(x1,x2), list(w1,w2)), by = n]

「x」列と「w」列が多数ある場合はgrep、列名を取得し、mget内部の値を返すために使用できますMap

setDT(data)[,  Map(weighted.mean, mget(grep('x', names(data), 
    value=TRUE)), mget(grep('w', names(data), value=TRUE))), by = n]
于 2015-06-11T04:54:17.050 に答える
4

試す:

library(dplyr)
data %>% 
  group_by(n) %>% 
  summarise(x1 = weighted.mean(x1, w1), x2 = weighted.mean(x2, w2))
于 2015-06-11T04:54:26.717 に答える