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

如何在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)

代码逻辑解释

  1. 标记目标行:用grepl识别出所有以Name:开头的行;
  2. 分组标记:给名字行、其上一行、下一行分配同一个组ID,其他行用自身行号作为组ID,确保需要合并的行在同一组;
  3. 组内拼接:按组ID分组后,用paste把组内的字符串拼接成完整内容;
  4. 清理结果:移除临时的组ID列,得到最终数据框。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 03:40:16