2014-06-10 22 views
33

Tôi đang cố gắng thay thế tất cả các cuộc gọi plyr của mình bằng dplyr. Hiện vẫn còn một vài snags và một trong số họ là với các chức năng group_by. Tôi tưởng tượng nó hoạt động giống như đối số ddply thứ hai và chia nhỏ, áp dụng và kết hợp dựa trên các biến nhóm tôi liệt kê. Nhưng đó không phải là trường hợp. Đây là một ví dụ khá tầm thường.Làm cách nào để sao chép hành vi ddply sử dụng chức năng tùy chỉnh với dplyr?

Hãy định nghĩa một hàm ngớ ngẩn

mm <- function(x) return(x[1:5, ]) 

Bây giờ chúng ta có thể chia nhỏ các loài trong iris bộ dữ liệu như vậy và áp dụng chức năng này để từng mảnh.

ddply(iris, .(Species), mm) 

Điều này hoạt động như dự định. Tuy nhiên, khi tôi thử cùng với dplyr, nó không hoạt động như mong đợi.

iris %>% group_by(Species) %>% mm 

Tôi đang làm gì sai?

Trả lời

34

Như được hiển thị trong ?do, bạn có thể tham khảo một nhóm với . trong biểu thức của mình. Sau đây sẽ tái ddply đầu ra của bạn:

iris %>% group_by(Species) %>% do(.[1:5, ]) 

# Source: local data frame [15 x 5] 
# Groups: Species 
# 
# Sepal.Length Sepal.Width Petal.Length Petal.Width Species 
# 1   5.1   3.5   1.4   0.2  setosa 
# 2   4.9   3.0   1.4   0.2  setosa 
# 3   4.7   3.2   1.3   0.2  setosa 
# 4   4.6   3.1   1.5   0.2  setosa 
# 5   5.0   3.6   1.4   0.2  setosa 
# 6   7.0   3.2   4.7   1.4 versicolor 
# 7   6.4   3.2   4.5   1.5 versicolor 
# 8   6.9   3.1   4.9   1.5 versicolor 
# 9   5.5   2.3   4.0   1.3 versicolor 
# 10   6.5   2.8   4.6   1.5 versicolor 
# 11   6.3   3.3   6.0   2.5 virginica 
# 12   5.8   2.7   5.1   1.9 virginica 
# 13   7.1   3.0   5.9   2.1 virginica 
# 14   6.3   2.9   5.6   1.8 virginica 
# 15   6.5   3.0   5.8   2.2 virginica 

Tổng quát hơn, để áp dụng một chức năng tùy chỉnh cho các nhóm với dplyr, bạn có thể làm điều gì đó như sau (nhờ @docendodiscimus):

iris %>% group_by(Species) %>% do(mm(.)) 
+6

+1 cộng , nếu OP muốn sử dụng chức năng tùy chỉnh của mình, anh ta cũng có thể làm điều đó: 'iris%>% group_by (Loài)%>% do (mm (.))' hoặc chỉ sử dụng 'iris%>% group_by (Loài)% >% do (head (., 5)) ' –

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