如何使用R语言gsub函数移除指定标点与数字并保留目标内容?
解决方案
你可以用精准的正则表达式只移除括号及其内部的数字,同时保留开头的序号和点号,还能顺手去掉点号后的多余空格,代码如下:
# 先移除括号及其中的数字(包括括号前可能的空格) df$column <- gsub("\\s*\\(\\d+\\)", "", df$column) # 再去掉点号后面的空格,把 "0. No" 转为 "0.No" df$column <- gsub("(\\d\\.)\\s", "\\1", df$column)
也可以合并成一行嵌套调用:
df$column <- gsub("(\\d\\.)\\s", "\\1", gsub("\\s*\\(\\d+\\)", "", df$column))
为什么之前的方法不对?
你之前用的gsub("[[:punct:]]", "", df$column)会移除所有标点(包括开头的点号),gsub("[[:num:]]", "", df$column)会删掉所有数字(包括开头的序号),这显然不是你想要的。我们的正则是精准定位目标:
\\s*\\(\\d+\\):匹配括号前的可选空格、左括号、括号里的数字、右括号,只把这部分替换为空。(\\d\\.)\\s:捕获开头的「数字+点号」,匹配后面的空格,替换成捕获到的内容,相当于去掉点号后的空格。
测试效果
假设你的数据是:
df <- data.frame(column = c("0. No (1)", "1. Yes(2)", "2. Refuse to Answer (3)", "3. Agree(4)", "4. Disagree (5)"))
运行代码后,df$column的结果为:
[1] "0.No" "1.Yes" "2.Refuse to Answer" "3.Agree" "4.Disagree"
完全符合你的期望。
内容的提问来源于stack exchange,提问作者Peter Chung
相关产品推荐
相关产品推荐

