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

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

逻辑说明

  1. 精准匹配优先:用正则\\((\\d{4})[–-](\\d{4})\\)捕捉维基人物条目常见的(YYYY–YYYY)格式,直接提取出生和逝世年份,这是最贴合维基条目规范的方式。
  2. 兼容无括号场景:如果文本中没有括号包裹的年份对,就用\\b\\d{4}\\b提取所有独立的4位数字,取前两个分别对应出生、逝世年份;不足两个时,逝世年份填充NA。
  3. tidyverse 风格实现:借助purrr::map对每行文本批量应用提取函数,再用unnest将嵌套的结果展开为数据框列,全程保持整洁的数据结构。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 23:42:39