2017-08-03 166 views
4

我需要一些幫助來將存儲在向量中的少數字符串與存儲在數據幀(data.table)列中的地址進行匹配。我的數據庫大約有100萬條記錄,因此我更喜歡使用data.table。在變量中搜索字符串並返回匹配的字符串

下面是數據和載體的虛擬樣品 -

my <- data.frame(add=c("50, nutan nagar Mum41","50, nutan Mum88 Maha","77, amar nagar Blr79 Bang","54, veer build Chennai3242","amar 755 Blr 400018")) 

vec1 <- c("Mum","Blr","Chennai") 

我需要在我的變量添加與每個地址搜索每個串的VEC 1。如果變量在地址中找到vec1中的任何字符串,它應該在新列中返回匹配的字符串結果。如果是多次匹配,則它應該返回第一個匹配的值,即Incase,它會在單個地址中找到「Mum」和「Blr」,並返回「Mum」。

基於僞數據,預期的結果將是 -

my$result <- c("Mum","Mum","Blr","Chennai","Blr") 

我試圖用grep/grepl但他們給錯誤「參數‘模式’的長度爲> 1且僅第一個元素將被用來「

我嘗試使用str_match,但得到TRUE/FALSE在向量中的每個串在地址中發現而不是價值本身。

我們該如何做到這一點?

回答

5

我們可以使用str_extract

library(stringr) 
str_extract(my$add, paste(vec1, collapse="|")) 
#[1] "Mum"  "Mum"  "Blr"  "Chennai" "Blr" 

或用base R

regmatches(my$add, regexpr(paste(vec1, collapse="|"), my$add)) 
#[1] "Mum"  "Mum"  "Blr"  "Chennai" "Blr"  
+2

比我的解決方案更清潔,沒有意識到這些功能。感謝您介紹我;) – Florian

+1

@akrun,太棒了!謝謝!!你做得很簡單。 – user1412

+0

@akrun,該解決方案適用於虛擬數據,但不適用於實際數據。我已經檢查過變量類型並將它們轉換爲字符,改變了類等,但它仍然沒有從矢量中找到任何文本。在我的實際數據文本中都是韓文字符,這會是一個問題嗎?我們怎麼能過來的。自昨晚以來我一直在嘗試,但沒有運氣。嘗試了兩種方法。請建議! – user1412

3

與基礎R可能的解決方案:

vec1[sapply(as.data.frame(do.call(rbind,lapply(vec1, 
     function(x) {grepl(x,my$add)}))), function(y) {min(which(y))})] 

回報:

[1] "Mum"  "Mum"  "Blr"  "Chennai" "Blr" 

希望這有助於!

+0

謝謝您的回答!我需要更多地瞭解適用的家庭功能。 – user1412

+0

當我嘗試在我的實際數據上使用韓文文本實現這條代碼時,我收到錯誤「錯誤(其中(y):參數與'哪個'不符合邏輯」)可能是什麼出錯了? – user1412

相關問題