2017-02-05 227 views
0

我有一個問題,從字符串列表部分匹配到數據框。R - 部分匹配字符串

我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謝卡爾給出的解決方案適用於少數元素的ADDRESS_LIST。就我而言,我真正ADDRESS_LIST有5000點以上的行和DF有20萬行和grep拋出這個錯誤:

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

我有很多的RAM,所以我不認爲這件事。我尋找一個解決方案,但我沒有找到任何方法來做到這一點。 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 

回答

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),] 
+0

在幾分鐘內我會試試這個。順便說一句,我的address_list有1500個值。有沒有辦法在管道內將所有這些值分開? –

+0

「bombero garrido」是一個字符串,因此df $ adrress中的值可能是「bombero garrido 23345,valdivia,losríos」,「bombero garrido 138,Antofagasta,Antofagasta」等。你的想法迫使我將「 bombero garrido「。 –

+0

給你的第二個評論 - 無論你保持文本分離還是一起它應該工作。讓我知道如果你仍然有問題 –