2017-03-17 20 views
0

私が書いた関数の調整には苦労しています。それは私に頭痛を与えているので、ここに投稿すると思います。By関数による加重平均

関数では、Rの "by"関数を使用しています。これは、データフレームを部分集合に入れ、その関数を実行します。

今、私は(descrパッケージから)weighted.meanをインクルードするように関数を拡張しています。xとwの長さが等しくないというエラーが出ます。

表示するいくつかのコード:

set.seed(100) 
d1 <- rnorm(300) 
d2 <- (floor(runif(100, min=1, max=4))) 
weight <- rnorm(300,mean = 1, sd = 1) 
df <- cbind.data.frame(d1,d2,weight) 
df$d2 <- factor(df$d2, 
       levels = c(1,2,3,4), 
       labels = c("red", "blue", "green","orange")) 



require('descr') 

by(df$d1, df$d2, function(x) mean(x=x, na.rm=TRUE)) 
by(df$d1, df$d2, function(x) weighted.mean(x=x,w=df$weight na.rm=TRUE)) 

だから私は、1つの数値でデータフレームを作る4つのレベルで1倍、唯一の3がデータを持っているのにだ(例えば欠けている/データをfitlered)と重み変数。

第8のコマンドは私が現在持っているものですが、今ではそれにも重みを加える必要があります。 これは私に色あたりの平均を与えます。また、それは私に必要なものではないデータを持っていないd2のレベルに対してNAを返します。 (私は異なるデータセットを扱っており、結果をマージする必要があるため、定義されているすべてのレベルも出力されることが重要です)。

9番目のコマンド(weighted.meanを持つコマンド)はエラーを返しますx/wの長さが異なること。 これは、df $ d2の部分につきdf $ d1の部分集合を作成するが、weighted.mean(x = x、w = weight、...)の重みは変数全体であり、サブセット

私はweighted.meanのコードを見て、私がそれを書き直すことができないのかどうかを見極めようとしていますが、解決策を見つけられませんでした。どんな助けもいつでも歓迎です。

答えて

0

トリックは、完璧に動作します。.. 1とは知らなかった、なインデックス

by(data = df, INDICES = df$d2, FUN = function(dfgroup) { 
    weighted.mean(x = dfgroup$d1, w = dfgroup$weight, na.rm=TRUE) 
}) 
+0

のTx万人で割っ入力として全体data.frameを使用することですが、今からそれを覚えています。.. –