【问题标题】:R gsub returns incorrect dataR gsub 返回不正确的数据
【发布时间】:2013-10-30 11:21:35
【问题描述】:

我是使用R 的新手,并且在使用gsub 正确格式化我的列表时遇到问题。我需要做两个替换。

  • 第一次替换将@ 之后的所有内容替换为@mydomain.com
  • 第二次替换将所有www. 替换为空值。

更新

我目前正在运行gsub 两次,并使用我的代码进行了更正,它可以正常工作。我有太多我没有看到的 gsub 实例。

vec <- c('john@mail.com', 'mike@mail.com', 'robbie.b@yahoo.com', 
         'zack.l.harris@aol.com', 'www.google.com', 'www.gmail.com', 
         'www.domain.com', 'www.example.com')

vec <- gsub("@.*\\.com", "@mydomain.com", vec)
vec <- gsub("www\\.", "", vec)

print(vec)

更新

但如果可能的话,我想将gsub 作为一个实例同时替换两者。

【问题讨论】:

  • 您没有将第一次 gsub 调用的结果分配给任何东西。
  • 你可以嵌套它:vec &lt;- gsub("www\\.", "", gsub("@.*\\.com", "@example.com", vec)).
  • 它在我的代码中分配
  • 请告诉我们你的问题是什么;如果它是在您的代码中分配的,那么您不应该得到不正确的格式。请参阅下面的我的答案,其中演示了。如果这不是您想要的,请向我们展示所需的输出。
  • 感谢您的澄清,我已在下面删除了我的答案。运行两次不令人满意的任何特殊原因?我想大多数用户会发现它比其他解决方案更简单、更易读。

标签: regex r vector gsub


【解决方案1】:

我这样做的一种方法是,您可以将 gsub 函数级联在一起。

vec <- gsub('@[^.]*\\.[^.]*', '@mydomain.com', gsub('www\\.', '', vec))
print(vec)

另一种解决方案是为您的 old values 和 replacement values

创建向量
re  <- c('@[^.]*\\.[^.]*', 'www\\.')
val <- c('@mydomain.com',  '')

recurse <- function(pattern, repl, x) {
    for (i in 1:length(pattern))
       x <- gsub(pattern[i], repl[i], x)
       x
}

vec <- c('john@mail.com', 'mike@mail.com', 'robbie.b@yahoo.com', 
         'zack.l.harris@aol.com', 'www.google.com', 'www.gmail.com', 
         'www.domain.com', 'www.example.com')

print(recurse(re, val, vec))

输出

"john@mydomain.com"          "mike@mydomain.com"         
"robbie.b@mydomain.com"      "zack.l.harris@mydomain.com"
"google.com"                 "gmail.com"                 
"domain.com"                 "example.com"     

【讨论】:

  • 我喜欢你做的递归函数。
猜你喜欢
  • 2019-11-22
  • 1970-01-01
  • 1970-01-01
  • 2011-06-11
  • 1970-01-01
  • 1970-01-01
  • 2016-12-05
  • 2020-10-04
  • 1970-01-01
相关资源
最近更新 更多