3

識別変数​​の組み合わせごとに集計/グループ化/分割する必要があるデータセットを分析する関数を作成したいと考えています。残念ながら、測定変数は多数あり、頻繁に変化し、それらを列挙すると脆弱なコードや入力のバグが発生します。

dat <- data.frame(id.a=c('aa','bb','aa','bb'),id.b=c('x','y','x','x'),m.c=c(1:4),m.d=c(5:8)) 
id.vars <- c('id.a', 'id.b')
measure.vars <- setdiff(names(dat),id.vars)

測定変数をまとめたいと思います。私は方法を見つけましたが、それらはすべてハッキーです。結果は次のようになります

id.a id.b m.c m.d
1   aa    x   4  12
2   bb    y   2   6
3   bb    x   4   8

reshape2 か ddply が解決策になりそうです。

4

3 に答える 3

4

提供されたコードを使用して:

dat <- data.frame(id.a=c('aa','bb','aa','bb'),id.b=c('x','y','x','x'),m.c=c(1:4),m.d=c(5:8)) 
id.vars <- c('id.a', 'id.b')
measure.vars <- setdiff(names(dat),id.vars)

そして実行:

aggregate(dat[measure.vars],dat[id.vars],sum)

生成:

  id.a id.b m.c m.d
1   aa    x   4  12
2   bb    x   4   8
3   bb    y   2   6
于 2012-04-06T01:05:53.657 に答える
3

プライヤー付き:

ddply(dat, .(id.a,id.b), numcolwise(function(x) sum(x)))
于 2012-04-06T01:29:30.000 に答える
2

これは、data.tableメモリ効率の良いソリューションです

dat <- data.frame(id.a=c('aa','bb','aa','bb'),id.b=c('x','y','x','x'),m.c=c(1:4),m.d=c(5:8)) 
id.vars <- c('id.a', 'id.b')
measure.vars <- setdiff(names(dat),id.vars)
DT <- as.data.table(dat)
DT[, lapply(.SD, sum), by = id.vars, .SDcols =measure.vars]
##   id.a id.b m.c m.d
## 1:   aa    x   4  12
## 2:   bb    y   2   6
## 3:   bb    x   4   8

id 以外のすべての列が測定列であると仮定すると (質問では暗示されていますが、要件として明示的に述べられていません)、次のように動作します。

 DT[, lapply(.SD, sum), by = id.vars]
于 2012-10-25T03:04:06.790 に答える