我有两个看起来像这样的数据框:
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.nation
与matcher
匹配(否)在表达之前或之后发生的事情)。
如果我这样做,它只匹配一个国家:
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
如果有人能指出我对我的循环有什么不对的方向那会很好。 谢谢!
答案 0 :(得分:1)
应该是
for (i in 1:length(df$var)) {
或者,甚至更好,
for (i in seq_along(df$var)) {
额外提示:您可以使用paste(..., sep="")
代替paste0(...)
。