2009-09-23 6 views
10

OK, ho due elenchi con nome, uno è "previsto" e uno è "osservato". Possono essere di struttura complessa, con tipi di dati arbitrari. Voglio ottenere una nuova lista contenente solo quegli elementi della lista osservata che sono diversi da quelli che sono nella lista prevista. Ecco un esempio:come faccio a ottenere la differenza tra due elenchi con nome R?

Lexp <- list(a=1, b="two", c=list(3, "four")) 
Lobs <- list(a=1, c=list(3, "four"), b="ni") 
Lwant <- list(b="ni") 

Lwant è ciò che voglio che il risultato sia. Ho provato questo:

> setdiff(Lobs, Lexp) 
[[1]] 
[1] "ni" 

No, che perde il nome, e non credo che setdiff presta attenzione ai nomi. L'ordine chiaramente non ha importanza qui e non voglio che a = 1 corrisponda a b = 1.

Non sicuro quale sia un buon approccio ... Qualcosa che scorre su un elenco di nomi (Lobs)? Sembra goffo e non-R, anche se fattibile ... Hai qualche idea elegante?

risposta

22

Almeno in questo caso

Lobs[!(Lobs %in% Lexp)]

ti dà ciò che si desidera.

+0

Stavo solo usando la funzione% in% ieri per il debug e stavo per raccomandarlo. –

0

OK, ho trovato una risposta leggermente ottuso, usando l'plyr pacchetto:

> Lobs[laply(names(Lobs), function(x) !identical(Lobs[[x]], Lexp[[x]]))] 
$b 
[1] "ni" 

Quindi, prende il nome dell'array dalla funzione osservato, utilizza doppio staffa indicizzazione e l'identica () per confrontare le sotto-liste, quindi usa la matrice binaria che risulta da laply() per indicizzare nella funzione originale osservata.

Chiunque ha un modo migliore/più pulito/più sexy/più veloce?

+1

Non hai bisogno di plyr: Lobs [sapply (nomi (Lobs), function (x)! Identici (Lobs [[x]], Lexp [[x]])) – Marek

+0

. @ Harlan - E 'possibile trovare la differenza percentuale tra due liste con la stessa struttura? Sto cercando di confrontare quanto differiscono le aspettative dall'osservato? –

Problemi correlati