在for循环中使用grepl()进行模糊匹配

时间:2017-04-29 20:11:06

标签: r

我有两个看起来像这样的数据框:

matcher<-data.frame(matcher.nation=c("","",""),matcher.var=c("test one","test two", "example one"))
matcher <- data.frame(lapply(matcher, as.character), stringsAsFactors=FALSE)
matcher
  matcher.nation matcher.var
1                   test one
2                   test two
3                example one

df<-data.frame(var=c("test","example"),nation=c("AFG","BEL"))
df <- data.frame(lapply(df, as.character), stringsAsFactors=FALSE)
df
      var nation
1    test    AFG
2 example    BEL

现在我想做一些模糊匹配来填充matcher$matcher.nation。因此,我写了以下循环:

for (i in length(df$var)){
  matcher$matcher.nation[grepl(paste(".*",df$var[i],".*",sep=""),
                               matcher$matcher.var)]<-df$nation[i]
}

应该遍历df$var,将其与matcher$matcher.var进行比较,如果在df$nation中找到表达式,则将matcher$matcher.nationmatcher匹配(否)在表达之前或之后发生的事情)。

如果我这样做,它只匹配一个国家:

matcher
  matcher.nation matcher.var
1                   test one
2                   test two
3            BEL example one

但是,如果我手动为i = 1(即在grepl中使用“test”),它可以完美地运行:

matcher$matcher.nation[grepl(paste(".*","test",".*",sep=""),matcher$matcher.var)]<-"AFG"
matcher
  matcher.nation matcher.var
1            AFG    test one
2            AFG    test two
3            BEL example one

如果有人能指出我对我的循环有什么不对的方向那会很好。 谢谢!

1 个答案:

答案 0 :(得分:1)

应该是

for (i in 1:length(df$var)) {

或者,甚至更好,

for (i in seq_along(df$var)) {

额外提示:您可以使用paste(..., sep="")代替paste0(...)