Función MATCH en r

tienen listas, la primera (list1) tiene id, name, age y las otras (list2, list3, ..) tiene ids 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 identificaciones 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ó en 200 celdas y las otras 3000 son N / A.

¿qué está mal?

Primero tienes errores tipográficos en tu ejemplo. En segundo lugar, la asignación de ‘list1 $ test1value’ debería tener un ‘[i]’ añadido para que no se guarde en cada ronda. Tampoco debe haber un ‘[i]’ añadido a list2$id ya que desea buscar todo el vector 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 ninguna razón para ningún bucle aquí. Usted muestra 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 tengas que sostener su mano e indicarle cómo atravesar cada elemento del vector. match repetirá 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 una manera ordenada en el conjunto de datos.

Cerraré esto como un duplicado porque, como otros sugirieron, merge es perfecto 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 
    Intereting Posts