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

无分组列时合并Data Frame行:合并tibble的col2行并去除空值

解决方案:无明确分组键时合并行数据

这是一个典型的无预设分组键的数据合并场景,我们可以通过生成临时分组标识的方式来划分需要合并的行组,具体实现依赖dplyr和stringr包的工具函数,步骤如下:

1. 构造原始数据

首先先还原你的输入数据:

library(dplyr)
library(stringr)  # 用于字符串拼接

original_tbl <- tibble::tibble(
  col1 = c("A","","C","",""), 
  col2 = c("string1 part 1","string1 part 2", "string2 part 1", "string2 part 2", "string3"), 
  col3 = c(1, "", 2, "", 3)
)

2. 核心处理逻辑

我们的核心思路是:每当col1或col3出现非空值时,就标记为一个新分组的起始行,然后按这个分组标识聚合数据:

result_tbl <- original_tbl %>%
  # 生成临时分组ID:只要col1/col3不同时为空,就开启新分组
  mutate(group_id = cumsum(!(col1 == "" & col3 == ""))) %>%
  # 按分组ID聚合
  group_by(group_id) %>%
  summarise(
    # 取分组内第一个非空的col1值,空字符串转为NA
    col1 = first(na_if(col1, "")),
    # 拼接分组内所有col2的字符串,用空格分隔
    col2 = str_c(col2, collapse = " "),
    # 取分组内第一个非空的col3值,转为数值型
    col3 = as.double(first(na_if(col3, "")))
  ) %>%
  # 移除临时分组列
  select(-group_id)

3. 验证结果

运行上述代码后,得到的结果完全符合你的目标:

result_tbl
#> # A tibble: 3 x 3
#>   col1  col2                                   col3
#>   <chr> <chr>                                <dbl>
#> 1 A     string1 part 1 string1 part 2          1
#> 2 C     string2 part 1 string2 part 2          2
#> 3 NA    string3                                3

逻辑说明

  • cumsum(!(col1 == "" & col3 == "")):通过累加判断条件生成分组ID,只要当前行的col1和col3不同时为空,就会让分组ID+1,从而把连续的属于同一组的行归在一起;
  • na_if(col, ""):把空字符串转换为NA,方便后续用first()提取非空值;
  • str_c(col2, collapse = " "):将分组内所有col2的字符串用空格拼接成完整内容。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 09:08:55