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

如何用R正则表达式高效替换指定位置空格为小数点修复数据

高效解决PDF导出数据的空格转小数点问题

针对你处理PDF导出数据时需要将特定位置空格替换为小数点的需求,这里提供两种基于向量化字符串操作的高效方案,替代原来繁琐的迭代提取逻辑:

方法一:正则批量替换 + 拆分列

利用正则表达式一次性将所有成对数字间的空格替换为小数点,再拆分出目标字段:

library(dplyr)
library(tidyr)
library(stringr)

# 原始数据
ex <- c("16 7978 38 78 651 42 651 42","25 1967 8 94 225 26 225 26",
        "16 5000 8 00 132 00 132 00", "16 6125 2 00 33 23 33 23")
df <- data.frame(row=1:4, string=ex)

# 处理流程
df_clean <- df %>%
  # 正则替换:将每一对连续数字间的空格换成小数点
  mutate(formatted = str_replace_all(string, "(\\S+) (\\S+)", "\\1.\\2")) %>%
  # 按空格拆分出4个目标字段
  separate(formatted, into = c("rate", "hours", "period_amt", "ytd_amt"), sep = " ") %>%
  # 保留需要的列
  select(row, string, rate, hours, period_amt, ytd_amt)

# 查看结果
print(df_clean)

输出结果:

row                     string   rate  hours period_amt ytd_amt
1   1 16 7978 38 78 651 42 651 42 16.7978 38.78     651.42  651.42
2   2  25 1967 8 94 225 26 225 26 25.1967  8.94     225.26  225.26
3   3  16 5000 8 00 132 00 132 00 16.5000  8.00     132.00  132.00
4   4    16 6125 2 00 33 23 33 23 16.6125  2.00      33.23   33.23

方法二:提取成对组合后重组列

先提取所有成对的数字段,再将每对转换为带小数点的数值并拆分到列:

library(dplyr)
library(tidyr)
library(stringr)

df_clean <- df %>%
  # 提取所有"数字+空格+数字"的组合,再替换空格为小数点
  mutate(values = str_extract_all(string, "\\S+ \\S+") %>%
           lapply(function(x) str_replace(x, " ", "."))) %>%
  # 将列表列拆分为多个独立列
  unnest_wider(values, names_sep = "") %>%
  # 重命名列
  rename(rate = values1, hours = values2, period_amt = values3, ytd_amt = values4) %>%
  select(row, string, rate, hours, period_amt, ytd_amt)

方案优势

  • 效率更高:采用向量化字符串操作替代逐元素迭代,处理大量数据时速度提升显著;
  • 代码简洁:避免多次重复的替换、提取、移除操作,逻辑清晰易维护;
  • 扩展性强:若后续字段数量变化,只需调整拆分后的列名或正则规则即可。

内容的提问来源于stack exchange,提问作者M.Bergen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 20:01:02