R-部分匹配字符串

R-部分匹配字符串,r,string-matching,R,String Matching,我有一个问题,从字符串列表到数据帧进行部分匹配 我的df具有以下结构: > df mrun address stat 8988741 cerro pedregal 8536 , Antofagasta, Antofagasta OK 17625851 rancagua 2777 , Iquique, Tarapacá OK 9423953 p

我有一个问题,从字符串列表到数据帧进行部分匹配

我的df具有以下结构:

> df
    mrun                                        address stat
 8988741 cerro pedregal 8536 , Antofagasta, Antofagasta   OK
17625851              rancagua 2777 , Iquique, Tarapacá   OK
 9423953              picarte 4100 , Valdivia, Los Ríos   OK
 3459140           balmaceda 935 , Temuco, La Araucanía   OK
24507700             rancagua 1940, La Serena, Coquimbo   OK
我有一个包含以下值的字符串列表:

> address_list
c("balmaceda", "rancagua", "bombero garrido")
如何选择与列表中任何元素匹配的行?


这是我的愿望输出:

> df_solution
    mrun                                        address stat
17625851              rancagua 2777 , Iquique, Tarapacá   OK
 3459140           balmaceda 935 , Temuco, La Araucanía   OK
24507700             rancagua 1940, La Serena, Coquimbo   OK 

编辑:saurav shekhar给出的解决方案适用于元素较少的地址列表。在我的例子中,我的真实地址列表超过5000行,df有200000行,grep抛出以下错误:

> df$flag[grep(address_list,df$address)]<- 1
Error in grep(address_list,df$address) : 
  invalid regular expression, reason 'Out of memory'

您需要做的第一件事是以以下格式创建匹配变量:

address_list<- paste(address_list, collapse = ",")
address_list<- gsub("," , "|" , address_list)
address_list<- c("balmaceda|rancagua|bombero|garrido")

几分钟后我会试试这个。顺便说一下,我的地址列表有1500个值。有没有办法通过管道将列表中的所有这些值分开?而“Bomberro garrido”是一个字符串,因此df$adrress中的值可以是“Bomberro garrido 23345,Valdivia,los ríos”,“Bomberro garrido 138,Antofagasta,Antofagasta”,等等。你的想法迫使我将“Bomberro garrido”分开.至于你的第二条评论,不管你是把正文分开还是放在一起,都应该有效。如果你还有问题,请告诉我是的,在df中添加标志非常可爱。谢谢@saurav shekar请检查我的问题编辑!
address_list<- paste(address_list, collapse = ",")
address_list<- gsub("," , "|" , address_list)
address_list<- c("balmaceda|rancagua|bombero|garrido")
# grep(address_list,df$address) Try this and note the output for your understanding of `grep`

df$flag<- NA
df$flag[grep(address_list,df$address)]<- 1 #flag rows with matching values
df_new<- df[which(df$flag==1),]