我是初学者,对R的高级功能不太熟悉。我无法理解为什么reduce()
不适用于grouped_df
。我正在我Rowwise summation for Tibble datatype的讨论基础上,我发布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)
为"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()
功能对分组数据不起作用,但适用于非分组数据?也许,我在这里遗漏了一些东西。
答案 0 :(得分:1)
您没有在上面的任何代码块中使用replace()
函数。您正在使用Reduce()
功能。
另外,df()
是stats
包中的密度分布函数 - 将对象分配给函数是不好的做法。
答案 1 :(得分:0)
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)