3

plyrから簡単に実行される集計用のdata.frameがありddplyます。ここでの目標は、集計オブジェクトを元のデータに自動的にバインドする関数を作成することです。問題は、複数の集計変数が存在する可能性があることです。

以下は、集計変数が1つしかない例を示しています。

ここに私が持っているデータフレームがあります:

  M O
1 1 6 
2 2 7 
3 2 4 
4 1 6 

次に、ddply「O」の集計を取得します。

TEST <- ddply(.data = DF,
              .variables = c("M"),
              .fun = summarise,
              NEW = sum(O))

結果は次のようになります。

  M NEW
1 1  12
2 2  11

ここでやりたいのは、変数" New"を元のdata.frameにバインドできる関数を作成することです。

ループでは、次のように機能します。

for(i in 1:nrow(TEST)) {
  DF$New[DF$M == TEST$M[i]] <- TEST$NEW[i]
  } 

  M O New
1 1 6  12 
2 2 7  11 
3 2 4  11 
4 1 6  12 

ここで、これを、集計変数が1つ以上ある場合でも、同等の出力を提供する関数に変換したいと思います。

4

2 に答える 2

5

ベースRでとを使用aveしてwithin、次のように複数の列を追加できます。data.frameが「mydf」と呼ばれると仮定します。

within(mydf, {
  P <- ave(O, M, FUN = sum)
  Q <- ave(O, M, FUN = mean)
})
#   M O   Q  P
# 1 1 6 6.0 12
# 2 2 7 5.5 11
# 3 2 4 5.5 11
# 4 1 6 6.0 12

もちろん、data.tableパッケージはさらに優れています。

library(data.table)
DT <- data.table(mydf)
DT[, `:=`(SUM = sum(O), MEAN = mean(O)), by = "M"]
DT
   M O SUM MEAN
1: 1 6  12  6.0
2: 2 7  11  5.5
3: 2 4  11  5.5
4: 1 6  12  6.0
于 2013-02-11T15:12:10.337 に答える
4

私がコメントで言ったように:

ddply(.data = DF,
      .variables = c("M"),
      .fun = transform,
       NEW = sum(O))
  M O NEW
1 1 6  12
2 1 6  12
3 2 7  11
4 2 4  11
于 2013-02-11T15:12:13.710 に答える