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

使用正则表达式去除R语言数据框中字母数字序列间的空格

解决方案

你的核心需求是提取地址中的字母数字混合带空格序列,去除空格后替换回原字符串,同时保留中间步骤的列。先说说你现有代码的问题:

  • apply(my_data, 1, ...)会把整行(id+var)转成字符串处理,完全没必要,应该只针对var列操作
  • 正则表达式匹配逻辑错误,没法准确捕捉你需要的带空格序列

下面是可以实现需求的完整代码,用base R就能搞定:

步骤1:定义匹配模式

首先写一个能准确匹配目标序列的正则,你的目标是类似A1B 6L2、g7u 6p2这种「两组字母数字混合字符串+中间空格」的结构,正则可以这么写:

pattern <- "\\b([A-Za-z0-9]+ [A-Za-z0-9]+)\\b"

\b是单词边界,避免匹配到比如apartment 6这种不是目标的序列。

步骤2:提取带空格的目标序列

用regmatches和regexpr从var列中提取匹配到的内容,生成no_space列:

my_data$no_space <- regmatches(my_data$var, regexpr(pattern, my_data$var))

步骤3:生成无空格的序列

把no_space里的空格去掉,得到spaces列:

my_data$spaces <- gsub(" ", "", my_data$no_space)

步骤4:生成最终处理后的列

用mapply逐行把var中的原带空格序列替换成无空格版本,得到var_final:

my_data$var_final <- mapply(function(original, replacement) {
  gsub(pattern, replacement, original)
}, my_data$var, my_data$spaces)

最终结果

运行完上面的代码后,my_data就是你要的输出:

> my_data
  id                                       var  no_space  spaces                                var_final
1  1                  123 river street A1B 6L2 A1B 6L2 A1B6L2                  123 river street A1B6L2
2  2 124 ocean road g7u 6p2 apartment number 5 g7u 6p2 g7u6p2 124 ocean road g7u6p2 apartment number 5
3  3                       apartment 6 k8b 7Ji k8b 7Ji k8b7Ji                       apartment 6 k8b7Ji

如果你的地址里可能存在多个这样的序列,只需要把regexpr换成gregexpr,regmatches会返回列表,再做相应调整即可,但从你的示例来看,每行只有一个目标序列,上面的代码完全够用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 04:30:51