假设我有一个简单的销售数据表
> df<-data.frame(country=c("A", "A", "B", "B"), outlet=c(1,2,1,2), sales=c(300, 900,10,40))
> df
country outlet sales
1 A 1 300
2 A 2 900
3 B 1 10
4 B 2 40
并希望添加一列,显示每个出口在该国家/地区的所有销售额中所占的比例。我可以用split
, 迭代然后重新组合 using来做到这一点rbind
,但这对我来说看起来很丑陋
> do.call("rbind",lapply(split(df, df$country), function(x) { x$frac <- NA; tot<-sum(x$sales); for (o in x$outlet) {s<-x[x$outlet== o,]$sales; x[x$outlet == o,]$frac <- s/tot}; return(x)}))
country outlet sales frac
A.1 A 1 300 0.25
A.2 A 2 900 0.75
B.3 B 1 10 0.20
B.4 B 2 40 0.80
有没有一种更简洁的方法来完成这个简单的任务(除了为它编写一个函数,只是将丑陋的东西扫到一个脚本中)?
(对于奖励积分,有没有办法防止rbind
将行名称添加A.1
到结果中data.frame
?)