2013-10-07 11 views
1

Я пытаюсь сравнить элементы из 2 векторов таким образом, но я получаю результат только для первого элемента.Как сравнить 2 вектора по элементам с помощью цикла

 >ex1<-c('gdgdg','dd','fffff','ssdsds') 

     fuct1<-function(x){ 
     for(i in 1:length(x)){ 
      ex2<-c('xxxx','ddd','ddd','ddd','dddd') 
      match<-agrep(x[i],ex2[i],value='true') 
      return(match[i]) 
     } 
     } 

     >fuct1(ex1) 

На этом примере я хочу сравнить «gdgdg» и «XXXX» (первые элементы из каждого вектора) «dd'and„ДДД“(вторые) и так далее ... В результате я бы например, иметь что-то как (NA, ddd, NA, NA). Мой результат с моим кодом - это просто NA. Спасибо за помощь.

+0

+1. Я думаю, вам нужно писать TRUE в шапках и без кавычек для дальнейшего использования. – Frank

+0

Почему вы назначаете постоянное значение внутри своего цикла for for? - это преднамеренное, опечатка? –

ответ

1

T думаю вы ищете mapply

mapply(agrep,ex1,ex2,value=TRUE) 

Но это предполагает, что ваши 2 вектора имеют одинаковую длину.

4

Вы хотите использовать sapply здесь:

ex2<-c('xxxx','ddd','ddd','ddd','dddd') 
sapply(ex1, function(x) agrep(x, ex2)) 

$gdgdg 
integer(0) 

$dd 
[1] 2 3 4 5 

$fffff 
integer(0) 

$ssdsds 
integer(0) 
+2

здесь нет необходимости в анонимной функции. Можно упростить 'sapply (ex1, agrep, ex2)' –

+0

В вашем ответе вы сравниваете каждое значение в первом со всеми значениями во втором векторе, но я хочу сравнить таким образом: ex1 [1] и ex2 [1] , ex1 [2] и ex2 [2], ex1 [3] и ex2 [3] ... – user222914

0

Может быть, это то, что вы хотите:

ex1<-c('gdgdg','ddd','fffff','ssdsds') 
match<-"TROLOLOL" 
fuct1<-function(x){ 
for(i in 1:length(x)){ 
ex2<-c('xxxx','ddd','ddd','dddd') 
    match<-c(match,agrep(x[i],ex2[i],value=TRUE)) 
    } 
return(match) 
} 
fuct1(ex1)[-1] 
[1] "ddd" 

Вы можете выполнить это, если вы хотите Nas я думаю :)

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