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

R语言:如何从脏数据列中提取年份字段?

解决方案:用正则表达式提取目标字段

因为你的nomenclature_of_loans列是脏数据,分隔符(空格、逗号、括号)不统一,用固定分隔符拆分容易出错。改用正则表达式匹配固定格式的目标字段是更可靠的方案,因为年份(4位数字,以20开头)和利率(数字+%,中间可能有空格)有明确的格式特征。

步骤1:提取年份(最优先需求)

直接用str_extract匹配字符串中的4位年份(示例中都是20xx格式,正则\\b20\\d{2}\\b可以精准匹配):

library(tidyverse)

govt_1_clean <- govt_1 %>%
  mutate(year = str_extract(nomenclature_of_loans, "\\b20\\d{2}\\b"))
  • \\b是单词边界,避免匹配到类似20100这样的长数字;
  • 20\\d{2}匹配以20开头的4位数字,覆盖绝大多数年份场景。

步骤2:提取并清洗利率

利率的格式是「数字(含小数)+ 任意空格 + %」,先用str_extract匹配这个模式,再用str_remove_all去掉中间的空格:

govt_1_clean <- govt_1_clean %>%
  mutate(
    rate_raw = str_extract(nomenclature_of_loans, "\\d+\\.\\d+\\s*%"),
    rate = str_remove_all(rate_raw, "\\s+")  # 去掉利率中间的所有空格
  ) %>%
  select(-rate_raw)  # 移除临时列
  • \\d+\\.\\d+匹配带小数的数字;
  • \\s*%匹配任意数量的空格后接%;
  • str_remove_all(\\s+)把12.25 %这类带空格的格式统一为12.25%。

完整合并代码

library(tidyverse)

govt_1 %>%
  mutate(
    year = str_extract(nomenclature_of_loans, "\\b20\\d{2}\\b"),
    rate = str_remove_all(str_extract(nomenclature_of_loans, "\\d+\\.\\d+\\s*%"), "\\s+")
  ) %>%
  select(notified_amount, rate, year)  # 保留需要的列

效果验证

针对你的示例数据,运行后会得到:

notified_amountrateyear
70006.64%2029
80007.46%2017
2500012.25%2010

该方案能处理带括号、多空格、逗号等脏数据场景,解决你遇到的350行提取失败问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 15:22:34