2015-04-08 15 views
5

Tôi có một data.frame như thế nàyR loại tóm tắt ddply theo nhóm tổng

x <- data.frame(Category=factor(c("One", "One", "Four", "Two","Two", 
"Three", "Two", "Four","Three")), 
City=factor(c("D","A","B","B","A","D","A","C","C")), 
Frequency=c(10,1,5,2,14,8,20,3,5)) 

    Category City Frequency 
1  One D  10 
2  One A   1 
3  Four B   5 
4  Two B   2 
5  Two A  14 
6 Three D   8 
7  Two A  20 
8  Four C   3 
9 Three C   5 

Tôi muốn thực hiện một bảng pivot với sum (Frequency) và sử dụng các chức năng ddply như thế này:

ddply(x,.(Category,City),summarize,Total=sum(Frequency)) 
    Category City Total 
1  Four B  5 
2  Four C  3 
3  One A  1 
4  One D 10 
5 Three C  5 
6 Three D  8 
7  Two A 34 
8  Two B  2 

Nhưng tôi cần kết quả này được sắp xếp theo tổng số trong mỗi nhóm Danh mục. Một cái gì đó như thế này:

Category City Frequency 
1  Two A  34 
2  Two B   2 
3 Three D  14 
4 Three C   5 
5  One D  10 
6  One A   1 
7  Four B   5 
8  Four C   3 

Tôi đã xem xét và cố sắp xếp, sắp xếp, sắp xếp, nhưng không có gì dường như làm những gì tôi cần. Làm thế nào tôi có thể làm điều này trong R?

Trả lời

4

đây là một phiên bản cơ sở R, nơi DF là kết quả của ddply cuộc gọi của bạn:

with(DF, DF[order(-ave(Total, Category, FUN=sum), Category, -Total), ]) 

sản xuất:

Category City Total 
7  Two A 34 
8  Two B  2 
6 Three D  8 
5 Three C  5 
4  One D 10 
3  One A  1 
1  Four B  5 
2  Four C  3 

Logic là cơ bản giống như David, tính tổng của Total cho mỗi Category, sử dụng số cho tất cả các hàng trong mỗi Category (chúng tôi làm điều này với ave(..., FUN=sum)), và sau đó sắp xếp theo đó cộng với một số máy cắt tie để đảm bảo công cụ đi ra như mong đợi.

+0

Đây cũng là một lựa chọn tuyệt vời. Cảm ơn bạn! –

5

Đây là một câu hỏi hay và tôi không thể nghĩ ra một cách thẳng thắn để làm điều này hơn là tạo ra một chỉ số tổng kích thước và sau đó sắp xếp theo nó. Dưới đây là một data.table tiếp cận khả thi trong đó sử dụng setorder chức năng mà sẽ đặt dữ liệu của bạn bằng cách tham khảo

library(data.table) 
Res <- setDT(x)[, .(Total = sum(Frequency)), by = .(Category, City)] 
setorder(Res[, size := sum(Total), by = Category], -size, -Total, Category)[] 
# Category City Total size 
# 1:  Two A 34 36 
# 2:  Two B  2 36 
# 3: Three D  8 13 
# 4: Three C  5 13 
# 5:  One D 10 11 
# 6:  One A  1 11 
# 7:  Four B  5 8 
# 8:  Four C  3 8 

Hoặc nếu bạn sâu trong Hdleyverse, chúng ta có thể đạt được một kết quả tương tự bằng cách sử dụng dplyr gói mới hơn (theo đề nghị của @akrun)

library(dplyr) 
x %>% 
    group_by(Category, City) %>% 
    summarise(Total = sum(Frequency)) %>% 
    mutate(size= sum(Total)) %>% 
    ungroup %>% 
    arrange(-size, -Total, Category) 
+0

Cảm ơn rất nhiều! Nó hoạt động –

Các vấn đề liên quan