使用正则表达式去除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
相关产品推荐
相关产品推荐

