如何在dplyr调用中切换分组变量?周数据缺失时改按月份求均值
解决方案:按周分组计算均值,无有效数据时自动切换为月均值
方法一:用ifelse判断替换
library(dplyr) fish <- structure(list(wk = c(20, 20, 20, 20, 20, 20, 20, 21, 21, 21, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 22), month = c(5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6), pd = c(6, 4, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 10, 4, 5, NA, 6)), row.names = c(NA, -21L), class = "data.frame") fish %>% # 按月份分组,计算当月pd均值并添加到每行 group_by(month) %>% mutate(month_mean = mean(pd, na.rm = TRUE)) %>% # 按周分组,判断周均值是否有效,无效则用月均值替换 group_by(wk) %>% summarise(Mean = ifelse(is.nan(mean(pd, na.rm = TRUE)), unique(month_mean), mean(pd, na.rm = TRUE)), .groups = "drop")
方法二:用coalesce简化替换逻辑
coalesce会自动返回第一个非缺失/非NaN的值,代码更简洁:
fish %>% group_by(month) %>% mutate(month_mean = mean(pd, na.rm = TRUE)) %>% group_by(wk) %>% summarise(Mean = coalesce(mean(pd, na.rm = TRUE), unique(month_mean)), .groups = "drop")
运行结果
# A tibble: 3 x 2 wk Mean <dbl> <dbl> 1 20 5 2 21 5.8 3 22 6.25
逻辑说明
- 先按
month分组计算当月的pd均值,确保每个周都能关联到所属月份的均值 - 再按
wk分组计算周均值,当周内无有效pd数据(均值为NaN)时,自动替换为对应月份的均值 .groups = "drop"用于取消分组,输出整洁的结果表格
内容的提问来源于stack exchange,提问作者Salvador
相关产品推荐
相关产品推荐

