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

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

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

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

Допустим, я бы хотел получить долю наблюдений в группе А, которые относятся к классу размеров 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.

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

Ответы на вопрос(1)

Ваш ответ на вопрос