有条件地删除 R 中向量元素的字符

Conditionally Remove Character of a Vector Element in R

提问人:Hack-R 提问时间:8/22/2014 最后编辑:Hack-R 更新时间:8/22/2014 访问量:2162

问:

我有(有时不完整的)地址数据,如下所示:

data <- c("1600 Pennsylvania Avenue, Washington DC", 
          ",Siem Reap,FC,", "11 Wall Street, New York, NY", ",Addis Ababa,FC,")  

如果第一个和/或最后一个字符是逗号,我需要删除它们。

到目前为止,我有:

for(i in 1:length(data)){
  lastchar <- nchar(data[i])
  sec2last <- nchar(data[i]) - 1
  if(regexpr(",",data[i])[1] == 1){
    data[i] <- substr(data[i],2, lastchar)
  }
  if(regexpr(",",data[i])[1] == nchar(data[i])){
    data[i] <- substr(data[i],1, sec2last)
  }
}

data

它适用于第一个字符,但不适用于最后一个字符。如何修改第二条语句或以其他方式实现我的目标?if

正则表达式 r 字符串 字符

评论

1赞 akrun 8/22/2014
你也可以这样做gsub("^,(.*),$","\\1", data)
0赞 Hack-R 8/22/2014
谢谢@akrun,学习这种不同的模式匹配方式是件好事。这是我的弱点。

答:

3赞 Avinash Raj 8/22/2014 #1

您可以尝试以下代码,删除开头或结尾处的逗号,

> data <- c("1600 Pennsylvania Avenue, Washington DC", 
+           ",Siem Reap,FC,", "11 Wall Street, New York, NY", ",Addis Ababa,FC,")
> gsub("(?<=^),|,(?=$)", "", data, perl=TRUE)
[1] "1600 Pennsylvania Avenue, Washington DC"
[2] "Siem Reap,FC"                           
[3] "11 Wall Street, New York, NY"           
[4] "Addis Ababa,FC" 

模式说明:

  • (?<=^),在正则表达式中称为正向后视。在我们的例子中,它断言逗号前面的内容必须是行开始。因此,它与起始逗号匹配。(?<=)^
  • |逻辑 OR 运算符通常用于组合(即 ORing)两个正则表达式。
  • ,(?=$)展望未来,逗号后面的内容一定是行尾。因此,它与行尾的逗号匹配。$

评论

0赞 Hack-R 8/22/2014
我真的很欣赏这个解决方案。冒着需要的风险,我想知道您是否可以稍微解释一下逻辑/正则表达式?我正在努力弄清楚,这样我就会更加独立。
0赞 Hack-R 8/22/2014
再次感谢;非常感谢!我相信其他人也会从中吸取教训,这要归功于模式解释。