2016-07-06 2 views
0

У меня есть два символьных вектора a, b с различными размерами. Я должен взять каждый элемент в a и сравнить со всеми элементами в b и отметить элемент, если есть близкое совпадение. Для сопоставления я использую функцию agrepl.Цитирование через 2 вектора разного размера в R

Ниже приводится образец данных

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 «s второго аргумента принимает векторы длины> = 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 с.

Если вы хотите индексы (из трас) вместо логических выражений, вы можете использовать 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' в примере –

Смежные вопросы