1

こんにちは私はループの使用を避けたいので、私の問題を解決するのを助けるためにplyrから何かを使用したいと思います。

データフレームから各因子に対して特別に選択された列の合計を取得する関数を作成したいと思います。

したがって、次のサンプルデータがある場合...

df <- data.frame(cbind(x=rnorm(100),y=rnorm(100),z=rnorm(100),f=sample(1:10,100, replace=TRUE))) 
df$f <- as.factor(df$f)

つまり、私は次のようなものが欲しいです:

foo <- function(df.obj,colname){
     some code
}

ここで、df.objdf上記の変数であり、colname引数は、、またはのいずれかにxなりyますz

そして、関数の出力/結果に、一意の因子の列(上記の場合は1:10)と、各因子の列xの値の合計が必要です。

解決策は非常に単純で、おそらく使用中ddplysummarise何らかの形であると思いますが、引数として列名を使用できるようにする方法を理解できません。

ありがとう

4

3 に答える 3

2

これはあなたが求めているものですか?

> ddply(df, .(f), colwise(sum))
    f          x           y          z
1   1 -0.4190284  2.61101681  1.2280026
2   2  1.1063977  2.40006922  4.9550079
3   3  0.4498366 -4.00610558  0.9964754
4   4  1.9325488 -2.81241212 -3.1185574
5   5 -4.1077670 -1.01232884 -3.9852388
6   6 -1.0488003 -2.42924689  3.5273636
7   7  2.2999306  0.85930085 -0.6245167
8   8 -4.8105311 -6.81352238 -2.1223436
9   9 -2.8187083  5.03391770  1.6433896
10 10  5.1323666 -0.06192382  1.8978994

編集:TSが提供する正解:

foo <- function(df.obj,colname){ddply(df, .(f), colwise(sum))[,c("f",colname)]}
于 2012-08-23T09:27:09.760 に答える
1

data.tableこれは、lapply(.SD,FUN) との.SDcols引数に最適のようです

  • .SDは、グループ列を除く各グループのxのデータのサブセットを含むdata.tableです。
  • .SDcols関数を適用する列の名前を含むベクトルです(FUN

セットアップdata.table

library(data.table)
DT <- as.data.table(df)

x、、列yの合計zf

DT[, lapply(.SD, sum), by = f, .SDcols = c("x", "y", "z")]

##      f       x       y       z
##  1:  4  4.8041  3.9788  1.2519
##  2:  2  1.1255 -0.8147  2.9053
##  3:  3  0.9699 -0.1550 -8.5876
##  4:  9  2.2685 -1.2734  1.0506
##  5:  5 -0.1282 -2.5512  5.0668
##  6: 10 -2.7397  0.5290 -0.3638
##  7:  1  2.9544 -3.1139 -1.3884
##  8:  8 -4.3488  0.6894  1.4195
##  9:  7  2.3152  0.6474  2.7183
## 10:  6 -0.1569  1.0142  0.9156

の合計、xおよびzf

DT[, lapply(.SD, sum), by = f, .SDcols = c("x", "z")]

##      f       x       z
##  1:  4  4.8041  1.2519
##  2:  2  1.1255  2.9053
##  3:  3  0.9699 -8.5876
##  4:  9  2.2685  1.0506
##  5:  5 -0.1282  5.0668
##  6: 10 -2.7397 -0.3638
##  7:  1  2.9544 -1.3884
##  8:  8 -4.3488  1.4195
##  9:  7  2.3152  2.7183
## 10:  6 -0.1569  0.9156

平均を計算する例

DT[, lapply(.SD, mean), by = f, .SDcols = c("x", "y", "z")]

##      f        x        y        z
##  1:  4  0.36955  0.30606  0.09630
##  2:  2  0.10232 -0.07407  0.26412
##  3:  3  0.07461 -0.01193 -0.66059
##  4:  9  0.15123 -0.08489  0.07004
##  5:  5 -0.01425 -0.28346  0.56298
##  6: 10 -0.21075  0.04069 -0.02799
##  7:  1  0.29544 -0.31139 -0.13884
##  8:  8 -0.54360  0.08617  0.17744
##  9:  7  0.38586  0.10790  0.45305
## 10:  6 -0.07844  0.50710  0.45782

DT[, lapply(.SD, mean), by = f, .SDcols = c("x", "z")]

##      f        x        z
##  1:  4  0.36955  0.09630
##  2:  2  0.10232  0.26412
##  3:  3  0.07461 -0.66059
##  4:  9  0.15123  0.07004
##  5:  5 -0.01425  0.56298
##  6: 10 -0.21075 -0.02799
##  7:  1  0.29544 -0.13884
##  8:  8 -0.54360  0.17744
##  9:  7  0.38586  0.45305
## 10:  6 -0.07844  0.45782
于 2012-09-10T02:52:02.777 に答える
0

コメントするのに十分な担当者がいないので、回答フォームで質問する必要があります-なぜRでループを使用しないようにしたいのですか?

編集:とにかくplyrを使用して私はcount()を使用します

于 2012-08-23T08:53:09.467 に答える