2013-02-21 33 views
7

Tôi đang cố gắng thu được tỷ lệ trong các tập hợp con của một khung dữ liệu. Ví dụ, trong dữ liệu khung làm-up này:Tính tỷ lệ trong các tập hợp con của một khung dữ liệu

DF<-data.frame(category1=rep(c("A","B"),each=9), 
    category2=rep(rep(LETTERS[24:26],each=3),2), 
    animal=rep(c("dog","cat","mouse"),6),number=sample(18)) 

Tôi muốn được giống như để tính toán tỷ lệ của mỗi trong ba loài động vật cho mỗi category1 bởi category2 kết hợp (ví dụ, trong số tất cả các động vật đều "Một "và" X ", tỷ lệ nào là chó?). Với prop.table trên cột 4 của khung dữ liệu, tôi có thể nhận được tỷ lệ mà mỗi hàng tạo thành từ cột "số", nhưng tôi đã không tìm thấy cách để làm điều này cho các tập con dựa trên loại 1 và 2. Tôi cũng đã cố gắng tách các dữ liệu bằng cách category1category2 sử dụng này:

splitDF<-split(DF,list(DF$category1,DF$category2)) 

và tôi đã hy vọng sau đó tôi có thể áp dụng một hàm với prop.table để có được tương ứng với mỗi động vật trong mỗi nhóm chia, nhưng tôi không thể có được prop.table làm việc vì tôi có thể' t dường như chỉ định cột dữ liệu nào để áp dụng hàm cho các nhóm chia tách. Có ai có bất cứ lời khuyên? Có thể điều này là có thể với plyr hoặc một cái gì đó tương tự? Tôi không thể tìm thấy bất kỳ điều gì trong diễn đàn trợ giúp về các cách để nhận tỷ lệ trong phạm vi tập hợp con dữ liệu.

Trả lời

6

Bạn có thể sử dụng hàm ddply() từ thư viện plyr để tính tỷ lệ cho mỗi kết hợp và sau đó thêm cột mới vào khung dữ liệu.

library(plyr)  
DF<-ddply(DF,.(category1,category2),transform,prop=number/sum(number)) 
DF 
    category1 category2 animal number  prop 
1   A   X dog  17 0.44736842 
2   A   X cat  3 0.07894737 
3   A   X mouse  18 0.47368421 
4   A   Y dog  2 0.14285714 
+0

Điều này thực sự đẹp và sạch sẽ. Cảm ơn rất nhiều, Didzis! plyr có vẻ là giải pháp cho rất nhiều loại vấn đề này, nhưng tôi phải mất một thời gian để làm quen với nó! – user2093526

3

điều này có tạo ra kết quả mong muốn của bạn không?

DF$proportion<-as.vector(unlist(tapply(DF$number,paste(DF$category1,DF$category2,sep="."),FUN=function(x){x/sum(x)}))); 
+0

Có, nó (cũng như câu trả lời của Didzis bằng cách sử dụng plyr). Cảm ơn bạn rất nhiều vì đã giúp đỡ của bạn! – user2093526

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