R 通过使用ddply按第二个类别分组,查找类别之间的比例

R 通过使用ddply按第二个类别分组,查找类别之间的比例,r,plyr,R,Plyr,我想找出一个数值在给定类别中的百分比分布,但按第二个类别分组。例如,假设我有一个带有区域、业务线和销售的数据框,我想通过业务线查找销售的百分比,按区域分组 我可以用R的内置aggregate和merge函数来实现这一点,但我很好奇,是否有一种较短的方法可以用plyr的'ddply函数来实现这一点,它可以避免显式调用merge创建一个交叉表并按比例计算呢 total_sales <- xtabs(sales~region+line_of_business, data=df) prop.tab

我想找出一个数值在给定类别中的百分比分布,但按第二个类别分组。例如,假设我有一个带有
区域
业务线
销售
的数据框,我想通过
业务线
查找
销售
的百分比,按
区域
分组


我可以用R的内置
aggregate
merge
函数来实现这一点,但我很好奇,是否有一种较短的方法可以用
plyr
'ddply
函数来实现这一点,它可以避免显式调用
merge

创建一个交叉表并按比例计算呢

total_sales <- xtabs(sales~region+line_of_business, data=df)
prop.table(total_sales, 1)

total_sales这里有一种使用plyr的方法:

library(plyr)
library(reshape2)

# Create fake data
sales = rnorm(1000,10000,1000)
line_of_business = sample(c("Sporting Goods", "Computers", "Books"), 
                          1000, replace=TRUE)
region = sample(c("East","West","North","South"), 1000, replace=TRUE) 
dat = data.frame(sales, line_of_business, region)

# Sales by region by line_of_business
dat_summary = ddply(dat, .(region, line_of_business), summarise,
                    tot.sales=sum(sales))

# Add percentage by line_of_business, within each region
dat_summary = ddply(dat_summary, .(region), transform, 
                    pct=round(tot.sales/sum(tot.sales)*100,2))

# Reshape, if desired
dat_summary_m = melt(dat_summary, id.var=c("region","line_of_business"))
dat_summary_w = dcast(dat_summary_m, line_of_business ~ region + variable, 
                      value.var='value', 
                      fun.aggregate=sum)
以下是最终结果:

> dat_summary_w
  line_of_business East_tot.sales East_pct North_tot.sales North_pct South_tot.sales South_pct
1            Books       852688.3    31.97        736748.4      33.2        895986.6     35.70
2        Computers       776864.3    29.13        794480.4      35.8        933407.9     37.19
3   Sporting Goods      1037619.8    38.90        687877.6      31.0        680199.1     27.10
  West_tot.sales West_pct
1       707540.9    27.28
2       951677.9    36.70
3       933987.7    36.02

您能否提供一个示例数据集和一个您尝试过的可复制示例?