R - 部分匹配字符串

时间:2017-02-05 00:34:21

标签: r string-matching

我在从字符串列表到数据帧的部分匹配方面遇到了问题。

我的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提供的解决方案适用于包含少量元素的address_list。在我的情况下,我的真实address_list有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'

我有很多内存,所以我不会考虑它。我找了一个解决方案,但我没有找到任何办法。 SO中唯一的密切线索是this link,但我不知道如何申请我的案例。

我的会话信息:

> sessionInfo()
R version 3.3.2 (2016-10-31)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows >= 8 x64 (build 9200)

locale:
[1] LC_COLLATE=Spanish_Latin America.1252  LC_CTYPE=Spanish_Latin America.1252   
[3] LC_MONETARY=Spanish_Latin America.1252 LC_NUMERIC=C                          
[5] LC_TIME=Spanish_Latin America.1252    

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] gridExtra_2.2.1 ggplot2_2.2.0   plyr_1.8.4      reshape_0.8.6  

1 个答案:

答案 0 :(得分:0)

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

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

然后使用grep,您可以对数据进行部分匹配,并为要保留的行创建标记。

# 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),]