2016-09-15 24 views
6

Tôi muốn thêm hàng tóm tắt tổng thể trong khi cũng tính tóm tắt theo nhóm bằng cách sử dụng dplyr. Tôi đã tìm thấy nhiều câu hỏi khác nhau về cách thực hiện điều này, ví dụ: here, herehere, nhưng không có giải pháp rõ ràng. Một cách tiếp cận có thể là để thực hiện count hai lần và ràng buộc các hàng:thêm tổng số hàng lề trong chuỗi dplyr

mtcars %>% 
    count(cyl, gear) %>% 
    bind_rows(
    count(mtcars, gear) 
) 

gần sản xuất những gì tôi cần (cột trái nhất có NA chứ không phải là 'Tổng' hoặc tương tự):

 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 
9  NA  3 15 
10 NA  4 12 
11 NA  5  5 

Tôi có thiếu giải pháp tích hợp/dễ dàng hơn không?

+3

bạn chỉ có thể thực hiện 'addmargins (bảng (mtcars $ cyl, mtcars $ gear))' trong cơ sở R. – mtoto

Trả lời

6

Một lựa chọn là với do

mtcars %>% 
    count(cyl, gear) %>% 
    ungroup() %>% 
    mutate(cyl=as.character(cyl)) %>% 
    do(bind_rows(., data.frame(cyl="Total", count(mtcars, gear)))) 
    #or replace the last 'do' step with 
    #bind_rows(cbind(cyl='Total', count(mtcars, gear))) #from @JonnyPolonsky's comments 

#  cyl gear  n 
# <chr> <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 
#9 Total  3 15 
#10 Total  4 12 
#11 Total  5  5 
+1

Cảm ơn @akrun, hoạt động rất tốt. Tôi không chắc chắn rằng cuộc gọi 'do' là cần thiết -' mtcars%>% đếm (cyl, gear)%>% ungroup()%>% biến đổi (cyl = as.character (cyl))%>% bind_rows (cbind (cyl = 'Total', count (mtcars, gear))) 'cũng hoạt động. Tôi sẽ chờ xem có ai cung cấp câu trả lời 'dplyr' trong xây dựng và sẽ chấp nhận trong vòng 24 giờ không. Rất cám ơn –

+1

@JonnyPolonsky Cảm ơn, tôi đang ở trong xe buýt nên không thể sử dụng chuột. Tht cũng nên làm việc. – akrun

+0

Không cần 'ungroup().' 'Count()' gọi 'group_by()' trước và 'ungroup()' sau. – Nettle

0

Một sự thêm vào câu trả lời @ arkrun của đó không phải là dễ dàng để thêm như một bình luận:

Mặc dù một chút phức tạp hơn, định dạng này cho phép thay đổi trước đó trong khung dữ liệu. Hữu ích khi có một chuỗi động từ dài hơn trước khi bảng được tạo ra. (Bạn muốn thay đổi tên hoặc chỉ chọn các biến cụ thể)

mtcars %>% 
    count(cyl, gear) %>% 
    ungroup() %>% 
    mutate(cyl=as.character(cyl)) 
bind_rows(group_by(.,gear) %>% 
       summarise(n=sum(n)) %>% 
       mutate(cyl='Total')) %>% 
spread(cyl) 

## A tibble: 3 x 5 
# gear `4` `6` `8` Total 
#* <dbl> <dbl> <dbl> <dbl> <dbl> 
#1  3  1  2 12 15 
#2  4  8  4  0 12 
#3  5  2  1  2  5 

Điều này cũng có thể tăng gấp đôi để tạo ra tổng số hàng cho sự lan truyền.

mtcars %>% 
    count(cyl, gear) %>% 
    ungroup() %>% 
    mutate(cyl=as.character(cyl), 
     gear = as.character(gear)) %>% 
    bind_rows(group_by(.,gear) %>% 
       summarise(n=sum(n)) %>% 
       mutate(cyl='Total')) %>% 
    bind_rows(group_by(.,cyl) %>% 
       summarise(n=sum(n)) %>% 
       mutate(gear='Total')) %>% 
    spread(cyl,n,fill=0) 

# A tibble: 4 x 5 
    gear `4` `6` `8` Total 
* <chr> <dbl> <dbl> <dbl> <dbl> 
1  3  1  2 12 15 
2  4  8  4  0 12 
3  5  2  1  2  5 
4 Total 11  7 14 32 
Các vấn đề liên quan