2

私はplyrを初めて使用し、クラス内の値の加重平均を取得して、複数の変数のデータフレームを再形成したいと考えています。次のコードを使用すると、x2 などの 1 つの変数に対してこれを行う方法がわかります。

set.seed(123)
frame <- data.frame(class=sample(LETTERS[1:5], replace = TRUE),
                    x=rnorm(20), x2 = rnorm(20), weights=rnorm(20))
ddply(frame, .(class),function(x) data.frame(weighted.mean(x$x2, x$weights)))       

ただし、コードで x と x2 (およびフレーム内の任意の量の変数) の新しいデータ フレームを作成したいと考えています。誰もこれを行う方法を知っていますか? ありがとう

4

2 に答える 2

7

関数で必要なものが見つかるかもしれません?summarisesummarise次のようにコードを複製できます。

library(plyr)
set.seed(123)
frame <- data.frame(class=sample(LETTERS[1:5], replace = TRUE), x=rnorm(20), 
                    x2 = rnorm(20), weights=rnorm(20))
ddply(frame, .(class), summarise, 
      x2 = weighted.mean(x2, weights)) 

同様にこれを行うにはx、その行を追加してsummarise関数に渡します。

ddply(frame, .(class), summarise, 
      x = weighted.mean(x, weights),
      x2 = weighted.mean(x2, weights)) 

編集: 多くの列に対して操作を実行する場合は、代わりにcolwiseorを使用するか、パッケージを使用してed データ フレームで実行してから、元の形式に戻ります。これが例です。numcolwisesummarisesummarisemeltreshape2cast


それは次のようになります:

wmean.vars <- c("x", "x2")

ddply(frame, .(class), function(x)
      colwise(weighted.mean, w = x$weights)(x[wmean.vars]))

最後に、 を指定する必要がない場合はwmean.vars、次のこともできます。

ddply(frame, .(class), function(x)
      numcolwise(weighted.mean, w = x$weights)(x[!colnames(x) %in% "weights"]))

これは、重み自体を除いて、すべての数値フィールドの加重平均を計算します。

于 2013-08-22T23:53:49.263 に答える
3

すべてのdata.table変数を個別に指定する必要もありません。

library(data.table)
frame <- as.data.table(frame)
keynames <- setdiff(names(frame),c("class","weights"))
frame[, lapply(.SD,weighted.mean,w=weights), by=class, .SDcols=keynames]

結果:

   class          x         x2
1:     B  0.1390808 -1.7605032
2:     D  1.3585759 -0.1493795
3:     C -0.6502627  0.2530720
4:     E  2.6657227 -3.7607866
于 2013-08-23T00:10:21.040 に答える