You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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  

规则说明

  1. 按A、B两列作为分组依据拆分数据
  2. 针对C到E的每一列做聚合:只要当前分组内该列存在u就保留u,否则保留原有值
  3. 聚合完成后自动取消分组,输出常规数据框格式

内容的提问来源于stack exchange,提问作者TarJae

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 20:06:03