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

在R中拆分数据框列:提取末尾括号内年份,分离姓名与年份

解决R中拆分姓名与年份列的问题

需求说明

需要将包含姓名(单名或全名)和入职年份的Name列拆分为独立的Name(姓名)和Year(年份)列,其中年份统一在括号内。

模拟数据

创建测试数据框:

library(tidyverse)

dat <- tibble(Name = c("Percy Vere (2020)", "Ginger Plant (2017)", "Perry (2019)",
                       "Pat Thettick (2020)", "Samuel (2022)", "Fay Daway (2008)",
                       "Greg (2022)", "Simon Sais (2011)"))

数据框内容:

# A tibble: 8 x 1
  Name               
  <fct>              
1 Percy Vere (2020)  
2 Ginger Plant (2017)
3 Perry (2019)       
4 Pat Thettick (2020)
5 Samuel (2022)      
6 Fay Daway (2008)   
7 Greg (2022)        
8 Simon Sais (2011) 

错误尝试及问题

使用默认separate函数拆分时,因未指定正确分隔符,导致姓名被错误拆分,年份无法正确提取:

dat %>% 
  select_all() %>% 
  separate(col = Name, into = c('Name', 'Year')) %>%
  tibble()

运行结果及警告:

# A tibble: 8 x 2
  Name   Year    
  <chr>  <chr>   
1 Percy  Vere    
2 Ginger Plant   
3 Perry  2019    
4 Pat    Thettick
5 Samuel 2022    
6 Fay    Daway   
7 Greg   2022    
8 Simon  Sais    
Warning message:
Expected 2 pieces. Additional pieces discarded in 8 rows [1, 2, 3, 4, 5, 6, 7, 8]. 

正确解决方案

方法一:使用separate配合字符串处理

通过指定分隔符为" \\("(空格加左括号)拆分,再移除年份列的右括号:

dat %>%
  separate(Name, into = c("Name", "Year"), sep = " \\(", remove = TRUE) %>%
  mutate(Year = str_remove(Year, "\\)"))

方法二:使用extract精准捕获(推荐)

利用正则表达式直接捕获姓名部分和四位数字的年份,一步完成拆分:

dat %>%
  extract(Name, into = c("Name", "Year"), regex = "(.*) \\((\\d{4})\\)", remove = TRUE)

两种方法均可得到正确结果:

# A tibble: 8 x 2
  Name         Year 
  <chr>        <chr>
1 Percy Vere   2020 
2 Ginger Plant 2017 
3 Perry        2019 
4 Pat Thettick 2020 
5 Samuel       2022 
6 Fay Daway    2008 
7 Greg         2022 
8 Simon Sais   2011 

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 17:35:11