如何在R语言中从字符串提取出生年份与逝世年份?
提取维基百科人物生卒年份的tidyverse实现
以下是符合tidyverse逻辑的简洁解决方案,优先匹配维基人物条目常见的括号内生卒年格式,再退而提取文本中的前两个4位数字:
library(wikifacts) library(tidyverse) # 定义提取生卒年的函数 extract_birth_death <- function(text) { # 优先匹配括号内的年份范围(如(1925–2013)) bracket_match <- str_match(text, "\\((\\d{4})[–-](\\d{4})\\)") if (!is.na(bracket_match[1])) { return(tibble(Birth_Year = bracket_match[2], Death_Year = bracket_match[3])) } # 无括号年份时,提取文本中前两个独立4位数字 years <- str_extract_all(text, "\\b\\d{4}\\b")[[1]] birth_year <- ifelse(length(years) >= 1, years[1], NA_character_) death_year <- ifelse(length(years) >= 2, years[2], NA_character_) return(tibble(Birth_Year = birth_year, Death_Year = death_year)) } # 原始数据处理 politicians <- data.frame( Name = c("Barack Obama", "Angela Merkel", "Nelson Mandela", "Margaret Thatcher", "Mahatma Gandhi"), stringsAsFactors = FALSE ) %>% mutate(First_Paragraph = substr(wiki_define(Name), 1, 200)) %>% # 应用函数提取年份并展开结果 mutate(year_data = map(First_Paragraph, extract_birth_death)) %>% unnest(year_data) # 查看结果 head(politicians)
逻辑说明
- 精准匹配优先:用正则
\\((\\d{4})[–-](\\d{4})\\)捕捉维基人物条目常见的(YYYY–YYYY)格式,直接提取出生和逝世年份,这是最贴合维基条目规范的方式。 - 兼容无括号场景:如果文本中没有括号包裹的年份对,就用
\\b\\d{4}\\b提取所有独立的4位数字,取前两个分别对应出生、逝世年份;不足两个时,逝世年份填充NA。 - tidyverse 风格实现:借助
purrr::map对每行文本批量应用提取函数,再用unnest将嵌套的结果展开为数据框列,全程保持整洁的数据结构。
内容的提问来源于stack exchange,提问作者Marco
相关产品推荐
相关产品推荐

