2015-07-01 12 views
6

Ho un grande tavolo con 50000 obs. Di seguito viene riprodotta la struttura:Come associare gli ID mancanti?

ID <- c(1,2,3,4,5,6,7,8,9) 
a <- c("A","B",NA,"D","E",NA,"G","H","I") 
b <- c(11,2233,12,2,22,13,23,23,100) 
c <- c(12,10,12,23,16,17,7,9,7) 
df <- data.frame(ID ,a,b,c) 

Dove ci sono alcuni valori mancanti sul vettore "a". Tuttavia, ho alcune tabelle in cui l'ID e le stringhe mancanti sono inclusi:

ID <- c(1,2,3,4,5,6,7,8,9) 
a <- c("A","B","C","D","E","F","G","H","I") 

key <- data.frame(ID,a) 

C'è un modo per includere le stringhe mancanti dalla chiave nella colonna un utilizzando l'ID?

risposta

2

Un'altra possibilità è quella di utilizzare data.table s veloce binario unirsi e aggiornamento per riferimento capabilit i

library(data.table) 
setkey(setDT(df), ID)[key, a := i.a] 
df 
# ID a b c 
# 1: 1 A 11 12 
# 2: 2 B 2233 10 
# 3: 3 C 12 12 
# 4: 4 D 2 23 
# 5: 5 E 22 16 
# 6: 6 F 13 17 
# 7: 7 G 23 7 
# 8: 8 H 23 9 
# 9: 9 I 100 7 

Se si desidera sostituire solo le NA s (non tutti cause riunite), un po 'più implemintation complicata sarà

setkey(setDT(key), ID) 
setkey(setDT(df), ID)[is.na(a), a := key[.SD, a]] 
+0

Ciao David, grazie per aver mostrato entrambi i modi. So che è difficile da spiegare senza mostrare i dati originali, ma entrambi i tuoi modi sono andati avanti senza errori e senza sostituire il 'NA' –

+0

Hai reale' NA's o solo carattere '" NA "'? Ad ogni modo, il primo metodo dovrebbe funzionare in ogni caso. È anche possibile che nessun caso in "chiave" corrisponda a 'df'. –

0

vettori Named rendono piacevoli le tabelle di ricerca:

lookup <- a 
names(lookup) <- as.character(ID) 

ricerca è ora un vettore di nome, è possibile accedere a ciascun valore di ricerca [ID] per esempio lookup [ "2"] (assicurarsi che il numero è un personaggio, non numerico)

## should give you a vector of a as required. 
lookup[as.character(ID_from_big_table)] 
+0

partita sembra essere più veloce su grandi vettori /data.frames. –

+0

Penso che in questo modo sia più leggibile della corrispondenza, ma sì la velocità è probabilmente importante per i frame grandi. – MarkeD

1

Si può semplicemente utilizzare match; tuttavia, suggerisco che entrambi i set di dati utilizzano character s invece di factor s per evitare mal di testa in seguito.

key$a <- as.character(key$a) 
df$a <- as.character(df$a) 

df$a[is.na(df$a)] <- key$a[match(df$ID[is.na(df$a)], key$ID)] 
df 
# ID a b c 
# 1 1 A 11 12 
# 2 2 B 2233 10 
# 3 3 C 12 12 
# 4 4 D 2 23 
# 5 5 E 22 16 
# 6 6 F 13 17 
# 7 7 G 23 7 
# 8 8 H 23 9 
# 9 9 I 100 7 

Naturalmente, si può sempre attaccare con factor s e fattore l'intera colonna "ID" e utilizzare le etichette per sostituire i valori nella colonna "a" ....

factor(df$ID, levels = key$ID, labels = key$a) 
## [1] A B C D E F G H I 
## Levels: A B C D E F G H I 

Assegna che a df$a e il gioco è fatto ....

+0

Ciao, grazie per il suggerimento. Seguendo il tuo consiglio, ho appena ricevuto i miei dati originali un vettore come output con la lunghezza del mio 'NA' mescolato con le voci e' NA' –

Problemi correlati