如何在R中按条件合并数据框行以整合姓名片段?
处理姓名片段数据框的行折叠需求
原始数据
我们有如下单列tibble,包含姓名片段和无关的"X"行:
df <- tibble( name = c( "Q", "Name: John", "Smith", "X", "J", "Name: Homer", "Simpson", "X", "X", "Q", "Name: John", "Citizen" ) )
输出结果:
> df # A tibble: 12 × 1 name <chr> 1 Q 2 Name: John 3 Smith 4 X 5 J 6 Name: Homer 7 Simpson 8 X 9 X 10 Q 11 Name: John 12 Citizen
需求说明
当某行以Name:开头时,将该行与其上一行(中间名首字母)、下一行(姓氏)拼接成完整姓名;其余行(如"X")保持原样。最终得到如下结果:
> df_fixed # A tibble: 6 × 1 name <chr> 1 Name: John Q Smith 2 X 3 Name: Homer J Simpson 4 X 5 X 6 Name: John Q Citizen
解决方案代码
使用dplyr包可以高效实现这个需求:
library(dplyr) df_fixed <- df %>% # 标记所有以Name:开头的行 mutate(is_name_row = grepl("^Name:", name)) %>% # 为需要合并的三行分配同一组ID mutate(group_id = case_when( is_name_row ~ row_number(), lag(is_name_row) ~ lag(row_number()), lead(is_name_row) ~ lead(row_number()), TRUE ~ row_number() )) %>% # 按组拼接姓名片段 group_by(group_id) %>% summarise(name = paste(name, collapse = " ")) %>% ungroup() %>% select(-group_id)
代码逻辑解释
- 标记目标行:用
grepl识别出所有以Name:开头的行; - 分组标记:给名字行、其上一行、下一行分配同一个组ID,其他行用自身行号作为组ID,确保需要合并的行在同一组;
- 组内拼接:按组ID分组后,用
paste把组内的字符串拼接成完整内容; - 清理结果:移除临时的组ID列,得到最终数据框。
内容的提问来源于stack exchange,提问作者Cameron
相关产品推荐
相关产品推荐

