r - 在 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])
为所有人输入and ?具体来说,是否有一种巧妙的方法可以用函数迭代地创建变量?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'))
推荐阅读
- django - 在 Django 模板中链接到 AWS S3 直接图像上传
- c# - 如何将 HTTPPostedFileBase 转换为 Google Drive API 文件
- javascript - 为什么 HTML 5 Geolocation API 不支持 Promise?
- google-drive-api - 为什么 Google Drive Listing V3 API 只显示文档的子集
- oauth-2.0 - 商家中心页面中缺少帐户
- javascript - 如何在java脚本中获取父元素类列表
- angular - 使用 Angular 7 将 Ag-Grid 导出为 PDF
- node.js - 如何在nodejs中将一个对象分配为另一个对象的属性
- pdf - SSRS 报告导出为 PDF,页面中间有硬分页符
- java - Spring 中使用 MappingMediaTypeFileExtensionResolver 的受保护方法的问题