tidyverse无需pivot按分组合并且替换指定列值的实现方法
R tidyverse无pivot方案实现分组行合并替换指定值
实现代码
无需任何pivot类函数,仅用dplyr基础分组聚合即可实现需求,以下两种写法均符合要求:
通用写法(适配多取值场景)
如果后续C-E列可能新增其他取值,推荐用显式判断逻辑:
library(tidyverse) # 原始数据 df <- structure(list(A = c(1L, 1L, 2L, 3L, 4L, 5L), B = c("a", "a", "b", "c", "d", "e"), C = c("u", "t", "t", "u", "t", "t"), D = c("t", "u", "u", "t", "u", "u"), E = c("t", "t", "u", "u", "u", "u")), class = "data.frame", row.names = c(NA, -6L)) # 合并逻辑 res <- df %>% group_by(A, B) %>% summarise( across(C:E, ~ifelse(any(.x == "u"), "u", first(.x))), .groups = "drop" )
极简写法(适配当前双取值场景)
当前C-E列只有t和u两个取值,利用u字符序大于t的特性,直接取分组内最大值即可:
res <- df %>% group_by(A, B) %>% summarise(across(C:E, max), .groups = "drop")
输出结果
两种写法运行后得到的结果完全匹配预期:
> res # A tibble: 5 × 5 A B C D E <int> <chr> <chr> <chr> <chr> 1 1 a u u t 2 2 b t u u 3 3 c u t u 4 4 d t u u 5 5 e t u u
规则说明
- 按A、B两列作为分组依据拆分数据
- 针对C到E的每一列做聚合:只要当前分组内该列存在
u就保留u,否则保留原有值 - 聚合完成后自动取消分组,输出常规数据框格式
内容的提问来源于stack exchange,提问作者TarJae
相关产品推荐
相关产品推荐

