Как я могу использовать ddply с разными .variables?

Я использую ddply, чтобы суммировать некоторые data.frame по различным категориям, например:

# with both group and size being factors / categorical
split.df <- ddply(mydata,.(group,size),summarize,
                  sumGroupSize = sum(someValue))

Это работает плавно, но часто мне нравится вычислять коэффициенты, которые подразумевают, что мне нужно разделить сумму на общую сумму группы. Как я могу рассчитать такую ​​сумму в рамках одного вызова ddply ?

Допустим, я хотел бы чтобы иметь долю наблюдений в группе A, которые относятся к классу размера 1. Очевидно, я должен сначала вычислить сумму всех наблюдений в классе размера 1. Конечно, я мог бы сделать это с двумя вызовами ddply, но было бы удобнее использовать только один вызов. Есть ли способ сделать это?

РЕДАКТИРОВАТЬ: Я не хотел спрашивать слишком конкретно, но понимаю, что беспокоил людей здесь. Итак, вот моя конкретная проблема. На самом деле у меня есть пример, который работает, но я не считаю его действительно изящным. Кроме того, у него есть недостаток, который мне нужно преодолеть: он не работает правильно с apply.

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)

Как видите, я намереваюсь провести это по разным категориальным переменным. В этом примере у меня всего два (категория, категория A), но на самом деле у меня их больше, поэтому использование apply с моей функцией было бы действительно неплохо, но почему-то это работает неправильно.

applytest <- head(apply(mydata[grep("^cat",
             names(mydata),value=T)],2,calcShares,data=mydata))   

.. возвращает предупреждающее сообщение и странное имя (newX [, i]) для категории var.

Как я могу сделать ЭТО а) более элегантно и б) исправить проблему с применением?

9
задан Matt Bannert 18 January 2012 в 08:55
поделиться