web-dev-qa-db-ja.com

dplyr / group_byを使用して行数を見つける

mtcarsデータセットを使用しています。特定のデータの組み合わせのレコード数を見つけたい。 SQLのcount(*) group by句に非常によく似たもの。 ddply() from plyrは私のために働いています

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()を取得できますか?

62
charmee

Dplyrには、行をカウントする(潜在的にグループ内に)特別な関数n()があります。

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
101

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

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

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

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

あなたが探しているのは次のとおりだと思います。

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

これはdplyrパッケージを使用しています。これは基本的に、docendo discimusが提供するcount()ソリューションの長文版です。

2
tb.