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_amount | rate | year |
|---|---|---|
| 7000 | 6.64% | 2029 |
| 8000 | 7.46% | 2017 |
| 25000 | 12.25% | 2010 |
该方案能处理带括号、多空格、逗号等脏数据场景,解决你遇到的350行提取失败问题。
内容的提问来源于stack exchange,提问作者Samvit0
相关产品推荐
相关产品推荐

