dplyrを使用してグループごとに行数をカウントする


83

mtcarsデータセットを使用しています。特定のデータの組み合わせのレコード数を調べたい。count(*)SQLのgroupby句に非常によく似たもの。plyrddply()から私のために働いています

library(plyr)
ddply(mtcars, .(cyl,gear),nrow)

出力があります

  cyl gear V1
1   4    3  1
2   4    4  8
3   4    5  2
4   6    3  2
5   6    4  4
6   6    5  1
7   8    3 12
8   8    5  2

このコードを使用する

library(dplyr)
g <- group_by(mtcars, cyl, gear)
summarise(g, length(gear))

出力があります

  length(cyl)
1          32

渡すさまざまな関数を見つけましたsummarise()が、どれも機能していないようです。私が見つけた関数の1つはsum(G)

Error in eval(expr, envir, enclos) : object 'G' not found

を使用してみましたがn()

Error in n() : This function should not be called directly

私は何が間違っているのですか?どうすれば私のためにgroup_by()/summarise()働くことができますか?


これは再現できません。からと同じ出力が得られddplyます。どのバージョンのdplyrを使用していますか?更新してみますか?
joran 2014年

私は最新バージョン0.1.3を持っています。0.1.2はありますか?
チャーミー2014年

いいえ。あなたの例は、0.1.3で私にとってはうまく機能します。
joran 2014年

1
どのバージョンのRをお持ちですか?それが行動の違いを引き起こしているのでしょうか?私も.. Ubuntuの、同じものを使用している自宅のコンピュータ上でこれを試してみました
charmee

2
ありがとう!!! それはそれを解決しました。plyrパッケージとdplyrパッケージの両方を添付している場合、summaryが期待どおりに機能しません。セッションを再開するとすぐに(そしてデフォルトですべての通常のパッケージを添付しなかった)、それを機能させることができました。ふぅ。
チャーミー2014年

回答:


126

n()dplyrには、行をカウントするための特別な関数があります(グループ内の可能性があります)。

library(dplyr)
mtcars %>% 
  group_by(cyl, gear) %>% 
  summarise(n = n())
#Source: local data frame [8 x 3]
#Groups: cyl [?]
#
#    cyl  gear     n
#  (dbl) (dbl) (int)
#1     4     3     1
#2     4     4     8
#3     4     5     2
#4     6     3     2
#5     6     4     4
#6     6     5     1
#7     8     3    12
#8     8     5     2

しかし、dplyrは、count入力を少なくしてまったく同じことを行う便利な関数も提供します。

count(mtcars, cyl, gear)          # or mtcars %>% count(cyl, gear)
#Source: local data frame [8 x 3]
#Groups: cyl [?]
#
#    cyl  gear     n
#  (dbl) (dbl) (int)
#1     4     3     1
#2     4     4     8
#3     4     5     2
#4     6     3     2
#5     6     4     4
#6     6     5     1
#7     8     3    12
#8     8     5     2

16

別のアプローチは、二重コロンを使用することです。

mtcars %>% 
  dplyr::group_by(cyl, gear) %>%
  dplyr::summarise(length(gear))

9

お探しの物は以下の通りだと思います。

cars_by_cylinders_gears <- mtcars %>%
  group_by(cyl, gear) %>%
  summarise(count = n())

これはdplyrパッケージを使用しています。これは本質的に、docendo discimusによって提供されるcount()ソリューションのロングハンドバージョンです。


私のために働きます。重要な部分は、グループ化する列名を引用符で囲むことではありません。
ivan8 6619年

3

別のオプション。必ずしもよりエレガントではありませんが、特定の列を参照する必要はありません。

mtcars %>% 
  group_by(cyl, gear) %>%
  do(data.frame(nrow=nrow(.)))

1
それはあなたに与えられるnrowデータセットではないグループのを
ハック-R
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.