我有一个数据集,我将值粘贴到dplyr链中,并用竖线字符折叠(例如“ |”)。如果数据集中的任何值为空白,我只会在粘贴列表中得到重复的管道字符。
其中一些值如下所示:
badstring = "| | | | | | GHOULSBY,SCROGGINS | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | CAT,JOHNSON | | | | | | | | | | | | BURGLAR,PALA | | | | | | | | |"
我想匹配所有不止一次出现的管道并删除它们,以使名称看起来像这样:
correctstring = "| GHOULSBY,SCROGGINS | CAT,JOHNSON | |BURGLAR,PALA |"
我尝试了以下操作,但无济于事:
mutate(names = gsub('[\\|]{2,}', '', name_list))
答案 0 :(得分:1)
这个问题的难点在于制定一个正则表达式,该正则表达式可以有选择地删除每个管道,但我们希望保留它们作为术语之间的实际分隔符的管道除外。我们可以按照以下模式进行匹配:
\|\s+(?=\|)
,然后仅替换空字符串。只要遵循的是另一个管道,此模式将删除所有管道(以及随后的空白)。当在管道后面加上实际的字词或在字符串的末尾跟上删除时,不会发生。
badstring = "| | | | | | GHOULSBY,SCROGGINS | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | CAT,JOHNSON | | | | | | | | | | | | BURGLAR,PALA | | | | | | | | |"
result <- gsub("\\|\\s+(?=\\|)", "", badstring, perl=TRUE)
result
[1] "| GHOULSBY,SCROGGINS | CAT,JOHNSON | BURGLAR,PALA |"
编辑:
如果您希望输入诸如| | |
之类的没有任何术语的输入,并且希望将空字符串作为输出,那么我的解决方案将失败。我看不到修改上述正则表达式的明显方法,但是您可以通过再调用sub
来处理这种情况:
result <- sub("^\\|$", "", result)
我们也许还可以修改原始模式以使用覆盖所有情况的替代方式:
result <- gsub("\\|\\s+(?=\\|)|(?:^\\|$)", "", badstring, perl=TRUE)