tôi sử dụng ddply để tóm tắt một số data.frame
theo thể loại khác nhau, như thế này:Tôi làm cách nào để sử dụng ddply với các biến .variables khác nhau?
# with both group and size being factors/categorical
split.df <- ddply(mydata,.(group,size),summarize,
sumGroupSize = sum(someValue))
này hoạt động trơn tru, nhưng thường tôi thích để tính toán tỷ lệ mà ngụ ý rằng tôi cần phải chia cho tổng của nhóm. Làm thế nào tôi có thể tính toán tổng số như vậy trong cùng một cuộc gọi ddply
?
Giả sử tôi muốn chia sẻ các quan sát trong nhóm A có kích thước lớp 1. Rõ ràng tôi phải tính tổng của tất cả các quan sát ở kích thước lớp 1 trước tiên. Chắc chắn tôi có thể làm điều này với hai cuộc gọi ddply, nhưng sử dụng tất cả một cuộc gọi sẽ thoải mái hơn. Có cách nào để làm vậy không?
EDIT: Tôi không có ý định hỏi quá cụ thể, nhưng tôi nhận ra rằng tôi đang làm phiền mọi người ở đây. Đây là vấn đề cụ thể của tôi. Trong thực tế, tôi có một ví dụ mà làm việc, nhưng tôi không xem xét nó thực sự tiện lợi. Thêm vào đó nó có một thiếu sót mà tôi cần phải vượt qua: nó không hoạt động đúng với áp dụng.
library(plyr)
# make the dataset more "realistic"
mydata <- warpbreaks
names(mydata) <- c("someValue","group","size")
mydata$category <- c(1,2,3)
mydata$categoryA <- c("A","A","X","X","Z","Z")
# add some NA
mydata$category[c(8,10,19)] <- NA
mydata$categoryA[c(14,1,20)] <- NA
# someValue is summarized !
# note we have a another, varying category hence we need the a parameter
calcShares <- function(a, data) {
# !is.na needs to be specific!
tempres1 <- eval(substitute(ddply(data[!is.na(a),],.(group,size,a),summarize,
sumTest = sum(someValue,na.rm=T))),
envir=data, enclos=parent.frame())
tempres2 <- eval(substitute(ddply(data[!is.na(a),],.(group,size),summarize,
sumTestTotal = sum(someValue,na.rm=T))),
envir=data, enclos=parent.frame())
res <- merge(tempres1,tempres2,by=c("group","size"))
res$share <- res$sumTest/res$sumTestTotal
return(res)
}
test <- calcShares(category,mydata)
test2 <- calcShares(categoryA,mydata)
head(test)
head(test2)
Như bạn có thể thấy tôi định chạy điều này qua các biến phân loại khác nhau. Trong ví dụ tôi chỉ có hai (category, categoryA) nhưng trên thực tế tôi có nhiều hơn, vì vậy việc sử dụng với hàm của tôi sẽ thực sự tốt đẹp, nhưng bằng cách nào đó nó không hoạt động chính xác.
applytest <- head(apply(mydata[grep("^cat",
names(mydata),value=T)],2,calcShares,data=mydata))
.. trả về thông báo cảnh báo và tên lạ (newX [, i]) cho danh mục var.
Vậy làm cách nào tôi có thể thực hiện điều này a) thanh lịch hơn và b) khắc phục sự cố áp dụng?
Tốt Q. Tôi luôn làm điều đó với ddply được bao bọc trong một ddply khác như bạn đã nói, vì vậy tôi cũng quan tâm đến giải pháp này. Sẽ 'table' +' prop.table' + 'addmargins' làm việc cho bạn, hay bạn cần thêm tính linh hoạt của ddply? –
Bạn sẽ không sử dụng hàm 'count' cho điều đó? Bộ nhớ của tôi là nó chỉ là một đổi tên của 'chiều dài' mà một trong những cần thiết để sử dụng với 'ave' trong cơ sở R. –
Hmm. tốt đẹp, không biết prop.table, nhưng tôi vẫn có thể sử dụng tính linh hoạt của ddply mặc dù. –