以下是一个玩具问题,可以解释我的问题.
我有一个包含大量员工的数据框; 对于每个员工,它有一个名称,工资,性别和州.
aggregate(salary ~ state) # Returns the average salary per state
aggregate(salary ~ state + gender, data, FUN = mean) # Avg salary per state/gender
Run Code Online (Sandbox Code Playgroud)
我实际需要的是每个州妇女所获总薪水的比例摘要.
aggregate(salary ~ state + gender, data, FUN = sum)
Run Code Online (Sandbox Code Playgroud)
返回每个州的女性(和男性)所获得的总薪水,但我真正需要的是每州一级的salary_w/salary_total.我可以写一个for循环等 - 但我想知道是否有一些方法可以使用聚合来做到这一点.
另一种选择是使用plyr.ddply()期望将data.frame作为输入,并将data.frame作为输出返回.第二个参数是您希望如何拆分数据框.第三个参数是我们想要应用于块的内容,这里我们summarise用来从现有的data.frame创建一个新的data.frame.
library(plyr)
#Using the sample data from kohske's answer above
> ddply(d, .(state), summarise, ratio = sum(salary[gender == "Woman"]) / sum(salary))
state ratio
1 1 0.5789860
2 2 0.4530224
Run Code Online (Sandbox Code Playgroud)
可能 reshape 或 reshape2 会对您的工作有所帮助。
这是一个示例脚本:
library(reshape2) # from CRAN
# sample data
d <- data.frame(expand.grid(state=gl(2,2),gender=gl(2,1, labels=c("Men","Wemon"))),
salaly=runif(8))
d2 <- dcast(d, state~gender, sum)
d2$frac <- d2$Wemon/(d2$Men+d2$Wemon)
Run Code Online (Sandbox Code Playgroud)