2009-11-23 38 views
8

Tôi hiện đang sử dụng cast trên bảng được tan chảy để tính tổng giá trị của mỗi giá trị tại tổ hợp biến ID1 (tên hàng) và ID2 (tiêu đề cột), cùng với tổng cộng hàng sử dụng margins="grand_col".Tính phần trăm của tổng số hàng với plyr

c <- cast(m, ID1 ~ ID2, sum, margins="grand_col")

ID1  ID2a ID2b  ID2c  ID2d ID2e (all) 
1 ID1a 6459695 885473 648019 453613 1777308 10224108 
2 ID1b 7263529 1411355 587785 612730 2458672 12334071 
3 ID1c 7740364 1253524 682977 886897 3559283 14123045 

Cho đến nay, vì vậy R-như thế nào.

Sau đó, tôi chia từng ô theo tổng số hàng của nó để nhận phần trăm tổng số.

c[,2:6]<-c[,2:6]/c[,7] 

Điều này có vẻ kludgy. Có điều gì tôi nên làm trong cast hoặc có thể trong plyr để xử lý phần trăm tính toán ký quỹ trong lệnh đầu tiên?

Cảm ơn, Matt

+0

tôi không có bất kỳ ý tưởng tuyệt vời ở đây. Tôi hy vọng một người khác làm được! – hadley

Trả lời

4

Giả sử bảng nguồn của bạn trông giống như sau:

dfm <- structure(list(ID1 = structure(c(1L, 2L, 3L, 1L, 2L, 3L, 1L, 
2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L), .Label = c("ID1a", "ID1b", "ID1c" 
), class = "factor"), ID2 = structure(c(1L, 1L, 1L, 2L, 
2L, 2L, 3L, 3L, 3L, 4L, 4L, 4L, 5L, 5L, 5L), .Label = c("ID2a", 
"ID2b", "ID2c", "ID2d", "ID2e"), class = "factor"), value = c(6459695L, 
7263529L, 7740364L, 885473L, 1411355L, 1253524L, 648019L, 587785L, 
682977L, 453613L, 612730L, 886897L, 1777308L, 2458672L, 3559283L 
)), .Names = c("ID1", "ID2", "value"), row.names = c(NA, 
-15L), class = "data.frame") 

> head(dfm) 
    ID1 ID2 value 
1 ID1a ID2a 6459695 
2 ID1b ID2a 7263529 
3 ID1c ID2a 7740364 
4 ID1a ID2b 885473 
5 ID1b ID2b 1411355 
6 ID1c ID2b 1253524 

Sử dụng ddply đầu tiên để tính toán tỷ lệ phần trăm, và cast để trình bày dữ liệu theo định dạng cần

library(reshape) 
library(plyr) 

df1 <- ddply(dfm, .(ID1), summarise, ID2 = ID2, pct = value/sum(value)) 
dfc <- cast(df1, ID1 ~ ID2) 

dfc 
    ID1  ID2a  ID2b  ID2c  ID2d  ID2e 
1 ID1a 0.6318101 0.08660638 0.06338147 0.04436700 0.1738350 
2 ID1b 0.5888996 0.11442735 0.04765539 0.04967784 0.1993399 
3 ID1c 0.5480662 0.08875735 0.04835905 0.06279786 0.2520195 

So với ví dụ của bạn, điều này thiếu các tổng số hàng, chúng cần phải được thêm vào .

Bạn không chắc chắn liệu giải pháp này có thanh lịch hơn so với giải pháp hiện tại của bạn hay không.

+0

Đó là giải pháp tốt hơn nếu chỉ vì các chỉ mục cột không cần phải được mã hóa cứng và tôi có thể sống mà không có tổng số cột. Kiểm tra là câu trả lời. Trong khi đó, điều gì đang xảy ra trong đối số ID2 = ID2 trong lệnh ddply của bạn? –

+0

Đối số tóm tắt của ddply tạo một khung dữ liệu mới và nếu ID2 không được chỉ định thì khung dữ liệu mới sẽ chỉ có hai cột - ID1 và pct. – learnr

4

Dưới đây là một lớp lót sử dụng tapplyprop.table. Nó không dựa trên bất kỳ gói auxilliary:

prop.table(tapply(dfm$value, dfm[1:2], sum), 1) 

cho:

 ID2 
ID1   ID2a  ID2b  ID2c  ID2d  ID2e 
    ID1a 0.6318101 0.08660638 0.06338147 0.04436700 0.1738350 
    ID1b 0.5888996 0.11442735 0.04765539 0.04967784 0.1993399 
    ID1c 0.5480662 0.08875735 0.04835905 0.06279786 0.2520195 

hoặc này mà thậm chí còn ngắn hơn:

prop.table(xtabs(value ~., dfm), 1) 
Các vấn đề liên quan