Đếm số hàng theo nhóm bằng dplyr


81

Tôi đang sử dụng mtcarstập dữ liệu. Tôi muốn tìm số lượng bản ghi cho một kết hợp dữ liệu cụ thể. Một cái gì đó rất giống với count(*)mệnh đề group by trong SQL. ddply()từ plyr đang làm việc cho tôi

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

có đầu ra

  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

Sử dụng mã này

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

có đầu ra

  length(cyl)
1          32

Tôi đã tìm thấy nhiều chức năng khác nhau để chuyển vào summarise()nhưng dường như không có chức năng nào phù hợp với tôi. Một chức năng tôi tìm thấy là sum(G), trả về

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

Đã thử sử dụng n(), kết quả trả lại

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

Tôi đang làm gì sai? Làm thế nào tôi có thể nhận được group_by()/ summarise()làm việc cho tôi?


Tôi không thể tái tạo điều này. Tôi nhận được đầu ra tương tự như từ ddply. Bạn đang sử dụng phiên bản dplyr nào? Thử cập nhật?
joran

Tôi có phiên bản mới nhất 0.1.3. Bạn có 0.1.2 không?
charmee

Không. Ví dụ của bạn hoạt động tốt đối với tôi với 0,1.3.
joran

1
Bạn có phiên bản R nào? Điều đó có thể gây ra sự khác biệt trong hành vi? Tôi cũng đã cố gắng này trên máy tính ở nhà mà đang sử dụng Ubuntu, cùng một điều ..
charmee

2
Cảm ơn!!! Điều đó đã giải quyết nó. Nếu tôi có cả gói plyr và dplyr được đính kèm, tóm tắt không hoạt động như mong đợi. Ngay sau khi tôi khởi động lại phiên (và không đính kèm tất cả các gói bình thường theo mặc định), tôi đã có thể làm cho nó hoạt động. Phù.
charmee

Câu trả lời:


123

Có một chức năng đặc biệt n()trong dplyr để đếm hàng (có khả năng trong các nhóm):

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

Nhưng dplyr cũng cung cấp một countchức năng tiện dụng hoàn toàn tương tự với việc gõ ít hơn:

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

một cách tiếp cận khác là sử dụng dấu hai chấm:

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

8

Tôi nghĩ những gì bạn đang tìm kiếm là như sau.

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

Đây là sử dụng gói dplyr. Về cơ bản, đây là phiên bản dài tay của giải pháp count () do docendo discimus cung cấp.


Làm việc cho tôi. Phần quan trọng là KHÔNG chỉ định các dấu ngoặc kép xung quanh các tên cột để nhóm theo.
ivan866

3

Một tùy chọn khác, không nhất thiết phải trang nhã hơn, nhưng không yêu cầu phải tham chiếu đến một cột cụ thể:

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

1
điều đó chỉ cung cấp cho bạn nrowtập dữ liệu chứ không phải nhóm
Hack-R
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.