0

我是初学者,对 R 的高级功能不太熟悉。我无法理解为什么reduce()不适用于grouped_df. 我在Rowwise summation for Tibble 数据类型的讨论基础上进行了讨论,reduce()当数据类型的类为:

"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)is "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()函数不适用于分组数据,但适用于非分组数据?也许,我在这里遗漏了一些东西。

4

2 回答 2

1

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

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

于 2017-01-07T07:59:19.830 回答
0

Reduce()replace()研究向量。

df1 分组数据框不仅仅是向量的集合。下面是翻开对象时的样子(在环境窗格中找到。) df 和 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)
于 2017-01-07T08:12:48.027 回答