Funzione MATCH in r

avere liste, la prima (lista1) ha id, nome, età e le altre (lista2, lista3, ..) ha id e valore di test (unico).

lista 1:

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

lista 2 (bio-test):

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

Sto cercando di aggiungere a list1 il valore di test per ogni id (non tutti gli id ​​hanno un valore di test).

questo è parte del codice:

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

ma guardando invece il valore di test per id, ha copiato solo il primo valore di test da list2 e lo ha copiato in 200 celle e gli altri 3000 sono N / A.

che c’è?

Innanzitutto hai errori di battitura nel tuo esempio. In secondo luogo, l’assegnazione di ‘list1 $ test1value’ dovrebbe avere un ‘[i]’ aggiunto ad esso per non salvare su ogni round. Non dovrebbe inoltre esserci un ‘[i]’ aggiunto a list2$id poiché si desidera cercare l’intero vettore per la ricerca.

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

Il codice funziona, ma non c'è motivo per nessun loop qui. Stai mostrando una mancanza di comprensione su come funziona R. Il codice sottostante fa esattamente la stessa cosa molto più veloce.

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

R è costruito in modo tale da non dover tenere la sua mano e istruirla su come passare attraverso ogni elemento del vettore. match scorrerà automaticamente ogni membro uno per uno e cercherà nell'altro vettore. Assegnerà anche il risultato in modo ordinato nel set di dati.

Chiuderò questo come un duplicato perché, come altri hanno suggerito, l' merge è perfetta per questo.

 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