【问题标题】:Row-wise summation for grouped_df data typegrouped_df 数据类型的逐行求和
【发布时间】:2017-05-22 00:08:51
【问题描述】:

我是初学者,对 R 的高级功能不太熟悉。我无法理解为什么 reduce() 不适用于 grouped_df。当数据类型为:

"tbl_df"     "tbl"        "data.frame"

这是示例数据:

  df <- data.frame(client = rep(c("Client A","Client B", "Client C"),3), 
                       year = rep(c(2014,2013,2012), each=3), 
                       rev1 = rep(c(10,20,30),3),
                       rev2 = rep(c(10,20,30),3))

其中,class (df)"tbl_df" "tbl" "data.frame"

我现在将df 转换为grouped_df 类:

df1 <- df %>% 
        group_by(client, year,rev1) %>%
        summarise(rev3 = sum(rev1,rev2)) %>%
        select(client, year, rev3, rev1)

其中,class (df1)"grouped_df" "tbl_df" "tbl" "data.frame",正如预期的那样。

现在,当我使用 reduce()df1 进行逐行求和时,它会引发错误。

df1%>% dplyr::mutate(sum=Reduce("+",.[3:4]))
Error: incompatible size (9), expecting 1 (the group size) or 1

但是,当我将df1 转换为数据框时,它运行良好。

df1%>% dplyr::as_data_frame() %>%  dplyr::mutate(sum=Reduce("+",.[3:4]))

上面输出的head()是:

# A tibble: 6 × 5
    client  year  rev3  rev1   sum
    <fctr> <dbl> <dbl> <dbl> <dbl>
1 Client A  2012    20    10    30
2 Client A  2013    20    10    30
3 Client A  2014    20    10    30
4 Client B  2012    40    20    60
5 Client B  2013    40    20    60
6 Client B  2014    40    20    60
...

谁能解释一下为什么reduce() 函数不适用于分组数据,但适用于非分组数据?也许,我在这里遗漏了一些东西。

【问题讨论】:

  • @Sotos - 是的,这是一个错字。我要纠正这个。感谢您的帮助。

标签: r dplyr purrr


【解决方案1】:

Reduce()replace() 处理向量。

df1 分组数据框不仅仅是向量的集合。下面是翻开对象时的样子(在环境窗格中找到。)

如果我们添加一个ungroup(),我们可以返回一个向量集合。

df2 <- df %>% 
    group_by(client, year,rev1) %>%
    summarise(rev3 = sum(rev1,rev2)) %>%
    select(client, year, rev3, rev1) %>% 
    ungroup %>% 
    mutate(sum=Reduce("+",.[3:4]))

无论如何,也许这个 dplyr 代码可以代替吗?

mutate(df, rev3 = rev1 + rev2, sum = 2*rev1 + rev2)

【讨论】:

  • 感谢您的帮助。我相信使用as_data_frame()ungroup() 会有同样的效果。你介意解释一下如果我们ungroup() 数据会发生什么吗?为什么reduce() 不适用于分组数据?我仍然不清楚“为什么”。
  • 在对数据框进行操作时观察您的环境。如果返回到一个简单的数据框(再次收集向量),则不会发生太多事情,因为您删除了grouped_df() 构建的所有属性。见这里:github.com/hadley/dplyr/blob/master/R/grouped-df.r Reduce 想要向量,当你喂它 attr() 它会得到一张满嘴皮毛的嘴,然后向你咳嗽:比喻。 :-D [我也很想知道其他人能提供什么。]
  • btw: class(attr) = "function" 但现在我怀疑它与fill 所遇到的相同类型的问题有更多关系。 github.com/tidyverse/tidyr/commit/…stackoverflow.com/questions/34517370/…
  • 老实说,我从来没有见过任何人能够解释为什么group_by 会导致它的行程上升。见stackoverflow.com/a/21656344/5088194(并注意第一条评论的十个赞成票:-D)我只知道当你在group_by抱怨长度不合适后开始收到警告时,这意味着你需要ungroup你的链或更早我记得在更远的地方添加了rowwise() 的版本。我以前从来没有时间拆过设备,但在我看来,函数确实不喜欢被喂函数。
  • @ hightower - 看起来类似于这种行为:lag() & lead() Issue 和 Romain Francois 在这里整理出来:bug fix #925。也许你可以把这个问题作为一个错误提交给 Hadley 和 Romain?我认为这将为您提供最完整的答案。
【解决方案2】:

您没有在上面的任何代码块中使用replace() 函数。您正在使用Reduce() 函数。

顺便说一句,df()stats 包中的密度分布函数 - 将对象分配给函数是不好的做法。

【讨论】:

  • 这不是答案。请避免发布 cmets 作为答案。一旦您获得足够的声誉,您就可以在任何地方发表评论。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-05
相关资源
最近更新 更多