2014-09-17 18 views
6

Tôi có một tập dữ liệu dài với một hàng cho mỗi nhóm được nhóm với các trường. Mỗi hàng có một yếu tố đặt hàng {1, 2, 3, 4}, "mèo". Tôi muốn lấy tỷ lệ phần trăm của 1, 2, 3 và 4 trong mỗi trường. Bộ dữ liệu trông như thế này:dplyr: Đếm/Tỷ lệ phần trăm của nhóm được phân loại theo trường không được nhóm

school_number   cats 
1   10505    3 
2   10505    3 
3   10502    1 
4   10502    1 
5   10502    2 
6   10502    1 
7   10502    1 
8   10502    2 
10   10503    3 
11   10505    2 

tôi đã cố gắng một cái gì đó như thế này:

df_pcts <- df %>% 
    group_by(school_number) %>% 
    mutate(total=sum(table(cats))) %>% 
    summarize(cat_pct = table(cats)/total) 

nhưng tổng biến sản xuất bởi bước đột biến() đặt tổng số lớn của các hàng trong mỗi hàng. Tôi thậm chí không thể đến bước tóm tắt cuối cùng. Tôi bối rối.

P.S. Trong một số bài viết khác tôi thấy dòng như thế này:

n = n() 

khi tôi làm điều đó tôi nhận được một thông báo nói,

Error in n() : This function should not be called directly 

đâu này đến từ đâu?

TIA

+0

gì đầu ra nào bạn cần? các cột riêng biệt cho 1,2,3 mèo hoặc các hàng riêng biệt cho mỗi tổ hợp trường học/mèo? – jalapic

+0

Bạn cũng có thể sử dụng 'df%>% group_by (số học, mèo)%>% tóm tắt (n = n())%>% biến đổi (pct = 100 * n/sum (n))' – akrun

+0

Bạn có thể gõ chỉ ' mutate' vào phiên của bạn, và xác nhận xem dòng cuối cùng của đầu ra có phải là '' không? Nếu đầu ra thay vào đó '', thì đó chính xác là vấn đề: bằng cách nào đó plyr được tải sau khi dplyr được nạp (và biến đổi của plyr không chú ý đến group_by). Đây là một nguyên nhân phổ biến (mặc dù không phải là duy nhất) của "group_by không làm việc" vấn đề. –

Trả lời

9

Có lẽ điều này giúp ích một chút, mặc dù tôi không chắc chắn 100% sản lượng bạn cần.

Điều này đếm số hàng của mỗi tổ hợp của số học sinh/mèo tồn tại trong df của bạn bằng cách sử dụng tally. Sau đó tính tỷ lệ phần trăm của 'mèo' trong mỗi trường học bằng cách chỉ nhóm theo số học sinh.

df %>% 
    group_by(school_number,cats) %>% 
    tally %>% 
    group_by(school_number) %>% 
    mutate(pct=(100*n)/sum(n)) 

Nó cung cấp này:

# school_number cats n  pct 
    # 1   10502 1 4 66.66667 
    # 2   10502 2 2 33.33333 
    # 3   10503 3 1 100.00000 
    # 4   10505 2 1 33.33333 
    # 5   10505 3 2 66.66667 

EDIT:

để thêm thành hàng với 0% mà bị thiếu từ dữ liệu mẫu của bạn, bạn có thể làm những điều sau đây. Liên kết với nhau đầu ra ở trên với một df có chứa 0% cho tất cả các kết hợp school_number/mèo. Chỉ giữ trường hợp đầu tiên của ràng buộc này (các cá thể đầu tiên luôn chứa các giá trị> 0% nếu chúng tồn tại). sau đó tôi sắp xếp nó bằng cách school_number và mèo để dễ đọc:

y<-df %>% 
    group_by(school_number,cats) %>% 
    tally %>% 
    group_by(school_number) %>% 
    mutate(pct=(100*n)/sum(n)) %>% 
    select(-n) 

x<-data.frame(school_number=rep(unique(df$school_number),each=4), cats=1:4,pct=0) 

rbind(y,x) %>% 
    group_by(school_number,cats)%>% 
    filter(row_number() == 1) %>% 
    arrange(school_number,cats) 

mang đến cho:

# school_number cats  pct 
#1   10502 1 66.66667 
#2   10502 2 33.33333 
#3   10502 3 0.00000 
#4   10502 4 0.00000 
#5   10503 1 0.00000 
#6   10503 2 0.00000 
#7   10503 3 100.00000 
#8   10503 4 0.00000 
#9   10505 1 0.00000 
#10   10505 2 33.33333 
#11   10505 3 66.66667 
#12   10505 4 0.00000 
0

Tất cả sự kết hợp của số học và mèo sau đó còn lại tham gia để tính PCT. Nếu NA sau đó 0

expand.grid(school_number = unique(df$school_number), cats = levels(df$cats)) %>% 
    left_join(df %>% 
       group_by(school_number, cats) %>% 
       tally %>% 
       mutate(pct = (n/sum(n) * 100))) %>% 
    select(-n) %>% 
    mutate(pct = ifelse(is.na(pct), 0, pct)) %>% 
    arrange(school_number) 

mang đến cho

school_number cats  pct 
1   10502 1 66.66667 
2   10502 2 33.33333 
3   10502 3 0.00000 
4   10502 4 0.00000 
5   10503 1 0.00000 
6   10503 2 0.00000 
7   10503 3 100.00000 
8   10503 4 0.00000 
9   10505 1 0.00000 
10   10505 2 33.33333 
11   10505 3 66.66667 
12   10505 4 0.00000 
+1

Trong khi đoạn mã này có thể giải quyết câu hỏi, [bao gồm một lời giải thích] (http: // meta. stackexchange.com/questions/114762/explaining-entirely-code-based-answers) thực sự giúp cải thiện chất lượng bài đăng của bạn. Hãy nhớ rằng bạn đang trả lời câu hỏi cho người đọc trong tương lai và những người đó có thể không biết lý do cho đề xuất mã của bạn. –

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