【问题标题】:R: mapply(gsub...) gives different results than gsub(...)R:mapply(gsub...) 给出的结果与 gsub(...) 不同
【发布时间】:2016-09-27 14:12:10
【问题描述】:

我的部分数据:

data <- c('googel', 'googele', 'googl', 'google .de', 'google kalender',
        'google maps', 'google.ch', 'www.google.ch', 'factbook', 'facebock',
        'facebok', 'facebook', 'facebook.ch', 'facebook.com', 'facebook.de', 'facebooke')

我必须将所有类似于 google 的词替换为“Google”,并将所有类似于 facebook 的词替换为“Facebook”。我可以用以下代码做到这一点:

### Google coding
> google <- gsub(pattern = '.*go.*g.*l.*', replacement = 'Google', data)

### Facebook coding
> fbGoogle <- gsub(pattern = '.*fa.*bo.*k.*', replacement = 'Facebook', google)
> plyr::count(fbGoogle)
         x freq
1 Facebook    8
2   Google    8

我想使用 mapply 来实现这一点,一个用于模式的向量和一个用于替换的向量。虽然我使用相同的(我知道非常原始)正则表达式,但我得到的结果与以前不同:

> ### Google and Facebook togeter
> patterns <- c('.*go.*g.*l.*', '.*fa.*bo.*k.*')
> replacements <- c('Google', 'Facebook')
> fbGoogleFail <- mapply(gsub, patterns, replacements, data)
> plyr::count(fbGoogleFail)
               x freq
1        facebok    1
2       Facebook    4
3    facebook.ch    1
4    facebook.de    1
5       factbook    1
6        googele    1
7         Google    4
8     google .de    1
9    google maps    1
10 www.google.ch    1

我在这里失败的想法?非常感谢任何帮助。

【问题讨论】:

  • 为什么要使用mapply
  • @Sotos:我有更多的模式要匹配和替换。使用两个向量比重复gsub 几十次更容易。 mapply 有更好的选择吗? (感谢您编辑我的问题)
  • @user2100721:我没有完全理解你的答案。我必须在哪里放置|
  • mapply 依次获取每个数据元素并交替检查 google 或 facebook(不是两者)

标签: r regex gsub mapply


【解决方案1】:

试试这个

gsubv <- Vectorize(function(pat,repl,data) gsub(pattern = pat,replacement = repl,x = data),vectorize.args = c("pat","repl"))
output <- gsubv(pat = patterns,repl = replacements,data = data)
output[-match(data,output)]
#[1] "Google"   "Google"   "Google"   "Google"   "Google"   "Google"   "Google"  
#[8] "Google"   "Facebook" "Facebook" "Facebook" "Facebook" "Facebook" "Facebook"
#[15] "Facebook" "Facebook"

【讨论】:

  • 我尝试了前两行,现在我的 R Studio 不再工作了。看起来它正在计算,即没有命令提示符>。但是控制台的右上角也没有停车标志。而且这些提示不会杀死进程:stackoverflow.com/questions/8370548/… 不得不ctrl-alt-del 它。
  • 谢谢,它适用于示例数据。我将在接下来的两个小时内对“真实”数据进行尝试,希望它也能在那里工作(长度为 27 的 repl 和 patt 向量,应用于长度为 2000 的数据)。
猜你喜欢
  • 1970-01-01
  • 2017-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多