如何解决在 R 中的 dplyr 管道中迭代总结
考虑 dplyr
中的以下简单 R
管道:
df <- data.frame(group = rep(LETTERS[1:3],each=5),value = rnorm(15)) %>%
group_by(group) %>%
mutate(rank = rank(value,ties.method = 'min'))
df %>%
group_by(group) %>%
summarise(mean_1 = mean(value[rank <= 1]),mean_2 = mean(value[rank <= 2]),mean_3 = mean(value[rank <= 3]),mean_4 = mean(value[rank <= 4]),mean_5 = mean(value[rank <= 5]))
如何避免在不返回到 mean_i = mean(value[rank <= i])
和 i
上的循环的情况下为所有 group
输入 i
?具体来说,是否有一种巧妙的方法可以使用 dplyr::summarise
函数迭代创建变量?
解决方法
您实际上是在这里计算累积平均值。 cummean
中有一个函数 dplyr
,我们可以在这里使用它并将数据转换为宽格式。
library(tidyverse)
df %>%
arrange(group,rank) %>%
group_by(group) %>%
mutate(value = cummean(value)) %>%
pivot_wider(names_from = rank,values_from = value,names_prefix = 'mean_')
# group mean_1 mean_2 mean_3 mean_4 mean_5
# <chr> <dbl> <dbl> <dbl> <dbl> <dbl>
#1 A -0.560 -0.395 -0.240 -0.148 0.194
#2 B -1.27 -0.976 -0.799 -0.484 -0.0443
#3 C -0.556 -0.223 -0.0284 0.0789 0.308
如果您要求通用解决方案并且计算累积平均值只是一个示例,那么您可以使用 map
。
n <- max(df$rank)
map(seq_len(n),~df %>%
group_by(group) %>%
summarise(!!paste0('mean_',.x):= mean(value[rank <= .x]))) %>%
reduce(inner_join,by = 'group')
数据
set.seed(123)
df <- data.frame(group = rep(LETTERS[1:3],each=5),value = rnorm(15)) %>%
group_by(group) %>%
mutate(rank = rank(value,ties.method = 'min'))
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。