2

R を使用している間、変数をグループごとに要約する data.frame で操作を実行し、それらの要約値を data.frame に追加したいことがよくあります。これは、例によって最も簡単に示されます。

myDF <- data.frame(A = runif(5), B = c("A", "A", "A", "B", "B"))
myDF$Total <- with(myDF, by(A, B, sum))[myDF$B]
myDF$Proportion <- with(myDF, A / Total)

これは以下を生成します:

          A B     Total Proportion
1 0.5272734 A 1.7186369  0.3067975
2 0.5105128 A 1.7186369  0.2970452
3 0.6808507 A 1.7186369  0.3961574
4 0.2892025 B 0.6667133  0.4337734
5 0.3775108 B 0.6667133  0.5662266

このトリック-基本的に名前付きの値のベクトルを取得し、それらをグループごとに関連する行に「広げる」または「伸ばす」-通常は機能しますclass(myDF$Total)が、."array"by()c()

不思議なんだけど:

  1. この操作に一般的に使用される名前はありますか?
  2. これを行う別の、ハッキー感の少ない、および/またはより高速な方法はありますか?
  3. これを行う方法はありdplyrますか?私が気付いていないハドリー承認の動詞操作 (mutate、arrange など) があるかもしれません。簡単にできることはわかっていますがsummarise()、これらの要約を data.frame に戻す必要があることがよくあります。
4

1 に答える 1

11

ベースRでこれを行う「ハックの少ない」方法を次に示します。

set.seed(1)
myDF <- data.frame(A = runif(5), B = c("A", "A", "A", "B", "B"))

within(myDF, {
  Total <- ave(A, B, FUN = sum)
  Proportion <- A/Total
})

#           A B Proportion    Total
# 1 0.2655087 A  0.2193406 1.210486
# 2 0.3721239 A  0.3074170 1.210486
# 3 0.5728534 A  0.4732425 1.210486
# 4 0.9082078 B  0.8182865 1.109890
# 5 0.2016819 B  0.1817135 1.109890

「dplyr」言語では、あなたが探していると思いますmutate

myDF %>%
  group_by(B) %>%
  mutate(Total = sum(A), Proportion = A/Total)

# Source: local data frame [5 x 4]
# Groups: B
# 
#           A B    Total Proportion
# 1 0.2655087 A 1.210486  0.2193406
# 2 0.3721239 A 1.210486  0.3074170
# 3 0.5728534 A 1.210486  0.4732425
# 4 0.9082078 B 1.109890  0.8182865
# 5 0.2016819 B 1.109890  0.1817135

"Introduction to dplyr" vignetteから、次の説明が見つかります。

既存の列のセットから選択するだけでなく、既存の列の関数である新しい列を追加すると便利なことがよくあります。これは の仕事ですmutate()dplyr::mutate()と同じように機能plyr::mutate()base::transform()ます。との主な違いはmutate()transform()mutate を使用すると、作成したばかりの列を参照できることです。


また、この「data.table」にタグを付けたので、「data.table」でコマンドを「チェーン」して、次のようなことを非常に簡単に行うことができます。

DT <- data.table(myDF)
DT[, Total := sum(A), by = B][, Proportion := A/Total][]
于 2014-02-20T18:39:51.240 に答える