如何使用dplyr按因子操作数据框

3
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)

返回一个列表而不是一个数据框。


我相信这就是 do 目前的工作方式(返回每个部分的列表)。我记得不久的将来会有一个变化,即 do 会将它们拼接在一起。你可以尝试从 Github 上获取开发版本。 - joran
...但是针对这个特定的例子,我认为你只需要使用 mutate - joran
2个回答

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

谢谢。这只是一个简化的例子,我的原始df是由summarise()生成的tbl,并且有另一列作为组。当使用mutate时,该列会导致一些问题。除了as.data.frame()之外,是否有一种强制重新按'a'分组的方法? - Flux
你能否更新你的问题并提供一个具体可重现的例子吗?这将使解决你的问题更容易。 - eipi10
我猜这个Stack Overflow问题是否解决了你遇到的问题? - eipi10

2

提到一个R基本解决方案,您可以使用transform(R基础等效于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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接