【问题标题】:How to manipulate a data.frame by factor with dplyr如何使用 dplyr 逐个操作 data.frame
【发布时间】:2014-06-08 13:27:28
【问题描述】:
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。

【问题讨论】:

  • 我相信这就是do 目前的工作方式(返回每件作品的列表)。我似乎记得更改此设置以便do 将它们重新缝合在一起是在不久的将来进行更改。你可以试试 github 的 dev 版本。
  • ...但是对于这个特殊的例子,我认为你需要的只是mutate

标签: r dataframe dplyr


【解决方案1】:
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”强制重新分组?
  • 你能用一个具体的可重现的例子来更新你的问题吗?这样可以更轻松地解决您的问题。
  • 只是在这里猜测,但this SO question 是否解决了您遇到的问题?
【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-05
    • 2016-11-20
    • 2020-08-08
    • 2019-02-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多