无分组列时合并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
相关产品推荐
相关产品推荐

