r match vlookup

Función MATCH en r



vlookup (1)

Primero tienes errores tipográficos en tu ejemplo. En segundo lugar, la asignación de ''list1 $ test1value'' debería tener un ''[i]'' agregado para no guardar en cada ronda. Tampoco debe agregarse una ''[i]'' a list2$id ya que desea buscar el vector completo para la búsqueda.

for (i in 1:length(list1)) { list1$test1value[i] <- list2$test[match(list1$id[i], list2$id, nomatch = NA_integer_, incomparables = NULL)] }

El código funciona, pero no hay razón para ningún bucle aquí. Está mostrando una falta de comprensión sobre cómo opera R. El siguiente código hace exactamente lo mismo mucho más rápido.

list1$test1value <- list2$test[match(list1$id, list2$id)]

R está construido para que no tenga que sostener su mano e indicarle cómo pasar por cada elemento del vector. match iterará automáticamente a través de cada miembro uno por uno y lo buscará en el otro vector por usted. También asignará el resultado de manera ordenada en el conjunto de datos.

Cerraré esto como un duplicado porque, como otros sugirieron, la merge es perfecta para esto.

merge(list1, list2[c("id", "test")], all.x=TRUE) # id age name test #1 1 40 danny 100 #2 2 16 nora NA #3 3 35 james NA #4 4 21 ben 55

Esta pregunta ya tiene una respuesta aquí:

tiene listas, la primera (list1) tiene id, nombre, edad y las otras (list2, list3, ..) tiene identificadores y valor de prueba (único).

lista 1:

id age name bio-test 1 40 danny 2 16 nora 3 35 james 4 21 ben

lista 2 (prueba biológica):

id test passed year 1 100 yes 1 5 80 yes n/a 4 55 no 2

Estoy tratando de agregar a list1 el valor de prueba para cada ID (no todas las ID tienen un valor de prueba).

esto es parte del código:

for (i in 1:length(list1)) { list1$test1value <- list2$test[match(list1$id[i], list2$id[i]), nomatch = NA_integer_, incomparables = NULL)] }

pero en lugar de buscar el valor de prueba por id, copió solo el primer valor de prueba de list2 y lo copió a 200 celdas y las otras 3000 son N / A.

¿qué está mal?