2016-07-06 41 views
0

我有兩個具有不同維度的字符向量a,b。我必須將a中的每個元素與b中的所有元素進行比較,並記錄元素是否緊密匹配。爲了匹配,我使用了agrepl函數。循環遍歷R中的2個不同維度的向量

以下是樣本數據

a <- c("US","Canada","United States","United States of America") 
b <- c("United States","U.S","United States","Canada", "America", "Spain") 

以下是我使用相匹配的代碼。請幫助我如何避免環路我的真實數據分別擁有900個5000條記錄

for(i in 1:4) 
{ 
    for(j in 1:6) 
    { 
     bFlag <- agrepl(a[i],b[j], max.distance = 0.1,ignore.case = TRUE) 

     if(bFlag) 
     { 
     #Custom logic 
     } 
     else 
     { 
     #Custom logic 
     } 
    } 
} 

回答

0

你並不需要一個雙循環,因爲agrepl的第二個參數接受長的矢量> = 1。所以你可以這樣做:

lapply(a, function(x) agrepl(x, b, max.distance = 0.1, ignore.case = TRUE)) 
# [[1]] 
# [1] TRUE TRUE TRUE FALSE FALSE TRUE 
# 
# [[2]] 
# [1] FALSE FALSE FALSE TRUE FALSE FALSE 
# 
# [[3]] 
# [1] TRUE FALSE TRUE FALSE FALSE FALSE 
# 
# [[4]] 
# [1] FALSE FALSE FALSE FALSE FALSE FALSE 

如果需要,您可以添加lapply裏面調用一些自定義的邏輯,但是這不是問題的規定,所以我就離開了輸出的logical的List。

如果你想(TRUEs)的指標,而不是邏輯值,你可以使用agrep代替agrepl

lapply(a, function(x) agrep(x, b, max.distance = 0.1,ignore.case = TRUE)) 

# [[1]] 
# [1] 1 2 3 6 
# 
# [[2]] 
# [1] 4 
# 
# [[3]] 
# [1] 1 3 
# 
# [[4]] 
# integer(0) 

如果你只想要第一個真正的指數,你可以使用:

sapply(a, function(x) agrep(x, b, max.distance = 0.1,ignore.case = TRUE)[1]) 
# US     Canada   United States United States of America 
# 1      4      1      NA 
+0

謝謝...!!!我期待向量b中元素的相應索引,如果它是真的。第一個真正的索引是足夠的 – Naveen

+0

@Naveen,如果你想要索引,只需在例子中使用'agrep'而不是'agrepl' –