2013-02-21 30 views
12

Tôi cần sử dụng nhóm theo cấp độ với ddply hoặc tổng hợp nếu điều đó dễ dàng hơn. Tôi không thực sự chắc chắn làm thế nào để làm điều này như tôi cần phải sử dụng cumsum như chức năng tổng hợp của tôi. Đây là những gì dữ liệu của tôi trông giống như:cumsum sử dụng ddply

level1  level2 hour  product 
A   tea  0   7 
A   tea  1   2 
A   tea  2   9 
A   coffee 17   7 
A   coffee 18   2 
A   coffee 20   4 
B   coffee 0   2 
B   coffee 1   3 
B   coffee 2   4 
B   tea  21   3 
B   tea  22   1 

đầu ra mong đợi:

A  tea  0 7 
A  tea  1 9 
A  tea  2 18 
A  coffee 17 7 
A  coffee 18 9 
A  coffee 20 13 
B  coffee 0 2 
B  coffee 1 5 
B  coffee 2 9 
B  tea  21 3 
B  tea  22 4 

Tôi đã cố gắng sử dụng

ddply(dd,c("level1","level2","hour"),summarise,cumsum(product)) 

nhưng điều đó không tổng hợp mà tôi nghĩ là do cột giờ đang được sử dụng cho nhóm và được phân chia bởi nó .. Tôi nghĩ .. Tôi không chắc tôi hoàn toàn hiểu cách thức tổng hợp hoạt động ở đây. Có cách nào tôi có thể nhận được sản lượng yêu cầu bằng cách sử dụng tổng hợp hoặc ddply?

+0

Tôi không nghĩ rằng bạn có nghĩa là để tóm tắt bởi level1 + level2 + giờ, bởi vì sau đó, sự kết hợp của bạn sẽ khác với những gì bạn đã được hiển thị. – A5C1D2H2I1M1N2O1R2T1

Trả lời

16

Dưới đây là một giải pháp trong cơ sở R sử dụng avewithin:

within(mydf, { 
    cumsumProduct <- ave(product, level1, level2, FUN = cumsum) 
}) 
# level1 level2 hour product cumsumProduct 
# 1  A tea 0  7    7 
# 2  A tea 1  2    9 
# 3  A tea 2  9   18 
# 4  A coffee 17  7    7 
# 5  A coffee 18  2    9 
# 6  A coffee 20  4   13 
# 7  B coffee 0  2    2 
# 8  B coffee 1  3    5 
# 9  B coffee 2  4    9 
# 10  B tea 21  3    3 
# 11  B tea 22  1    4 

Tất nhiên, nếu bạn muốn thả các cột sản phẩm hiện có, bạn có thể thay đổi lệnh sau để ghi đè cột "sản phẩm" hiện tại:

within(mydf, { 
    product <- ave(product, level1, level2, FUN = cumsum) 
}) 

Cách tiếp cận hiện tại của bạn không hoạt động một phần vì bạn đã bao gồm "giờ" làm một trong các biến nhóm của bạn. Nói cách khác, nó được nhìn thấy sự kết hợp của "A + tea + 0" khác với "A + tea + 1", nhưng từ sản lượng mong muốn của bạn, bạn dường như chỉ muốn kết hợp "A + tea" là nhóm.

aggregate sẽ không hoạt động như bạn mong đợi, vì nó sẽ ngưng mọi thứ thành một số data.frame với cùng số hàng như số kết hợp duy nhất của "level1" và "level2", trong trường hợp này là 4 hàng. Cột tổng hợp sẽ là list. Các giá trị sẽ chính xác, nhưng nó sẽ ít hữu ích hơn.

Dưới đây là aggregate và sản lượng của nó:

> aggregate(product ~ level1 + level2, mydf, cumsum) 
    level1 level2 product 
1  A coffee 7, 9, 13 
2  B coffee 2, 5, 9 
3  A tea 7, 9, 18 
4  B tea  3, 4 
+0

cảm ơn! điều này hoạt động :) Vì vậy, khi bạn cung cấp cho sản phẩm, level1 và level2 như ba cột là bạn nói với nó để chọn 3 và nhóm bởi những gì là khác nhau? – Roshini

+1

'ave' chỉ áp dụng hàm cho một biến (biến đầu tiên) được nhóm theo nhiều biến số khác nếu cần. Bởi vì điều này, 'FUN' phải được sử dụng để gọi bất kỳ hàm nào bạn muốn áp dụng cho biến * đầu tiên *. – A5C1D2H2I1M1N2O1R2T1

+0

@AnandaMahto những bất lợi của việc dạy con người là nó không tổng quát cũng như tình huống mới, và nó cũng _really_ không hiệu quả nếu sự kết hợp của các biến nhóm là thưa thớt (tiếc là nó là một lỗi đơn giản mà R-core đã không cố định). – hadley

7

bạn nên sử dụng transform thay vì summarise:

# you should probably order your `level2` first 
dd$level2 <- factor(dd$level2, levels=c("tea", "coffee")) 
# and transform using level1 and level2 alone, not hour 
# if you use hour, the groups will be for each row 
ddply(dd, .(level1, level2), transform, product=cumsum(product)) 

# level1 level2 hour product 
# 1  A tea 0  7 
# 2  A tea 1  9 
# 3  A tea 2  18 
# 4  A coffee 17  7 
# 5  A coffee 18  9 
# 6  A coffee 20  13 
# 7  B tea 21  3 
# 8  B tea 22  4 
# 9  B coffee 0  2 
# 10  B coffee 1  5 
# 11  B coffee 2  9 
+0

Cảm ơn bạn đã trả lời ... nhưng nếu tôi có nhiều hơn 2 cấp độ trong level2. Có thể dễ dàng là một kịch bản mà tôi có thể có khoảng 10 cấp độ hoặc nhiều hơn, tôi sẽ phải đặt chúng trong một vector mỗi lần? – Roshini

+1

'dd $ level2 <- hệ số (dd $ level2, levels = dd $ levels2 [! Sao chép (dd $ levels2)], order = T)' – Arun

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