Как сравнить 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» и «ddd» (вторые) и так далее... В результате я хотел бы иметь что-то вроде (NA , ддд, н/д, н/д). Мой результат с моим кодом просто NA. Спасибо за вашу помощь.


person user222914    schedule 07.10.2013    source источник
comment
+1. Я думаю, вам нужно написать ИСТИНА заглавными буквами и без кавычек, для дальнейшего использования.   -  person Frank    schedule 07.10.2013
comment
Почему вы присваиваете постоянное значение внутри вашего for loop - это преднамеренно, опечатка?   -  person Ricardo Saporta    schedule 07.10.2013


Ответы (3)


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

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

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

person agstudy    schedule 07.10.2013

Вы хотите использовать 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)
person tcash21    schedule 07.10.2013
comment
здесь нет необходимости в анонимной функции. Можно упростить до sapply(ex1, agrep, ex2) - person Ricardo Saporta; 07.10.2013
comment
В своем ответе вы сравниваете каждое значение в первом со всеми значениями во втором векторе, но я хочу сравнить таким образом: ex1[1] и ex2[1],ex1[2] и ex2[2],ex1[3 ] и ex2[3]... - person user222914; 07.10.2013

Возможно, это то, что вы хотите:

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"

Вы можете завершить это, если хотите NA, я думаю :)

person Julian Wittische    schedule 07.10.2013