5

以下を含むグループテーブルごとの要約を取得する効率的な方法を見つけることに興味があります。

  • グループごとの一意の値のカウント
  • 選択した変数の記述統計量のプリミティブ セット

たとえば、記述統計を生成する場合、次のコードを使用しています。

data("mtcars")
require(dplyr)
mt_sum <- mtcars %>% 
  group_by(cyl) %>% 
  summarise_each(funs(min,max), hp, wt, disp)

これにより、目的の出力が生成されます。

> head(mt_sum)

Source: local data frame [3 x 7]

    cyl hp_min wt_min disp_min hp_max wt_max disp_max
  (dbl)  (dbl)  (dbl)    (dbl)  (dbl)  (dbl)    (dbl)
1     4     52  1.513     71.1    113  3.190    146.7
2     6    105  2.620    145.0    175  3.460    258.0
3     8    150  3.170    275.8    335  5.424    472.0

各グループごとの値の数を反映する図でデータを充実させることに興味があります。カウントに関しては、これは簡単に実行できます。

mt_sum2 <- mtcars %>% 
  group_by(cyl) %>% 
  summarise(countObs = n())

これにより、必要なデータが生成されます。

> head(mt_sum2)
Source: local data frame [3 x 2]

    cyl countObs
  (dbl)    (int)
1     4       11
2     6        7
3     8       14 

問題

この問題は、両方の変換を同時に適用したい場合に発生します。

試行 1

たとえば、コード:

mt_sum <- mtcars %>% 
  group_by(cyl) %>% 
  summarise_each(funs(min,max), hp, wt, disp) %>% 
  summarise(countObs = n())

生成されます:

Source: local data frame [3 x 2]

    cyl countObs
  (dbl)    (int)
1     4       11
2     6        7
3     8       14

以前に生成された記述統計なし。

試行 2

コード:

mt_sum <- mtcars %>% 
  group_by(cyl) %>% 
  summarise_each(funs(min,max,n), hp, wt, disp)

失敗すると予想されます:

Error: n does not take arguments

試行 3 (動作中)

コード:

data("mtcars")
require(dplyr)
mt_sum <- mtcars %>% 
  group_by(cyl) %>% 
  summarise_each(funs(min,max), hp, wt, disp) %>% 
  left_join(y = data.frame(
    "Var1" = as.numeric(as.character(as.data.frame(table(mtcars$cyl))$Var1)),
    "Count" = as.character(as.data.frame(table(mtcars$cyl))$Freq)),
            by = c("cyl" = "Var1"))

必要なデータを提供します:

> head(mt_sum)
Source: local data frame [3 x 8]

    cyl hp_min wt_min disp_min hp_max wt_max disp_max  Count
  (dbl)  (dbl)  (dbl)    (dbl)  (dbl)  (dbl)    (dbl) (fctr)
1     4     52  1.513     71.1    113  3.190    146.7     11
2     6    105  2.620    145.0    175  3.460    258.0      7
3     8    150  3.170    275.8    335  5.424    472.0     14

これは、この要約を作成する非常に非効率的な方法だと思います。特に、大きなテーブルを操作する場合、その場でオブジェクトを作成するのは非効率的です。同じ結果を達成することに興味がありますが、マージのためだけにオブジェクトを作成する必要のない、より効率的な方法です。特に、私がやりたいことdplyrは、テーブルの以前のバージョンから追加の要約を導出することに対応します。例えば:

  1. グループ
  2. 記述統計を作成する
  3. グループ化したらデータに戻る
  4. いくつかの追加の統計を生成し、最終データに追加します
4

1 に答える 1

3

を使用した別の (短い) オプションを次に示しますleft_join

mtcars %>% 
    group_by(cyl) %>%  
    summarise_each(funs(min,max), hp, wt, disp) %>% 
    left_join(count(mtcars, cyl))
#Joining by: "cyl"
#Source: local data frame [3 x 8]
#
#    cyl hp_min wt_min disp_min hp_max wt_max disp_max     n
#  (dbl)  (dbl)  (dbl)    (dbl)  (dbl)  (dbl)    (dbl) (int)
#1     4     52  1.513     71.1    113  3.190    146.7    11
#2     6    105  2.620    145.0    175  3.460    258.0     7
#3     8    150  3.170    275.8    335  5.424    472.0    14
于 2015-12-07T13:03:48.920 に答える