df <- data.frame(a=factor(c(1,1,2,2,3,3) ), b=c(1,1, 10,10, 20,20) )
a b
1 1 1
2 1 1
3 2 10
4 2 10
5 3 20
6 3 20
我想按列a拆分数据框,计算每组中的b / sum(b),并将结果放在c列中。有了plyr,我可以做到:
fun <- function(x){
x$c=x$b/sum(x$b)
x
}
ddply(df, .(a), fun )
并且
a b c
1 1 1 0.5
2 1 1 0.5
3 2 10 0.5
4 2 10 0.5
5 3 20 0.5
6 3 20 0.5
但我怎么能用dplyr做呢?
df %.% group_by(a) %.% do(fun)
返回一个列表而不是data.frame。
答案 0 :(得分:5)
df %>%
group_by(a) %>%
mutate(c=b/sum(b))
a b c
1 1 1 0.5
2 1 1 0.5
3 2 10 0.5
4 2 10 0.5
5 3 20 0.5
6 3 20 0.5
答案 1 :(得分:2)
只需提及一个R基础解决方案,您可以使用transform
(R base相当于mutate
)和ave
函数来分割矢量并应用函数。
> transform(df, c=ave(b,a, FUN= function(b) b/sum(b)))
a b c
1 1 1 0.5
2 1 1 0.5
3 2 10 0.5
4 2 10 0.5
5 3 20 0.5
6 3 20 0.5