在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
相关产品推荐
相关产品推荐

