2014-04-25 1 views
5

Sono un po 'perplesso dai nomi prodotti da unlist(). Si prega di considerare quanto segue MWECome evitare la modifica unlist() della denominazione dell'elenco

vector1 <- c(1,2,3,4,5,6,7,8,9,10) 
names(vector1) <- c(1,2,2,3,4,4,5,6,6,6) 
names(vector1) 
# [1] "1" "2" "2" "3" "4" "4" "5" "6" "6" "6" 
list1 <- split(vector1,names(vector1)) 
names(list1) 
# [1] "1" "2" "3" "4" "5" "6" 

ma poi

names(unlist(list1)) 
# [1] "1.1" "2.2" "2.2" "3.3" "4.4" "4.4" "5.5" "6.6" "6.6" "6.6" 

Secondo la documentazione di unlist()

Per impostazione predefinita, non elencati cerca di conservare le informazioni di denominazione presenti in x.

quindi non riesco a dare un senso a questo particolare comportamento.

Il mio problema è che i nomi creati da unlist() non possono essere confrontati con i nomi dell'originale vector1.

+0

Potrebbe chiarire un po ', per favore. Cosa stai cercando di fare esattamente? –

+0

@RichardScriven Sto cercando di capire perché nomi di output unlist() come '" 1.1 "' invece di quello che mi aspetterei '"1" '. – CptNemo

risposta

6
unlist(unname(list1)) 
# 1 2 2 3 4 4 5 6 6 6 
# 1 2 3 4 5 6 7 8 9 10 
+0

anche 'unlist (list1, use.names = FALSE)' che penso non copi l'elenco mentre non si nomina. –

+0

@MartinMorgan - Ma questo elimina completamente i nomi, che non è ciò che l'OP vuole. –

+0

scusa, non ho letto abbastanza attentamente la domanda. –

5

Sono solidale con la vostra frustrazione. R sta (penso) cercando di conservare entrambe le informazioni in names(x) e le informazioni nei nomi dei componenti originali (considerare i risultati di unlist(setNames(list1,letters[1:6])), il che rende il comportamento più sensato).

È possibile ottenere quello che vuoi tramite

setNames(unlist(list1),unlist(lapply(list1,names))) 

anche se è certamente imbarazzante - Vorrei fare questo in un unlistWithNames funzione (o qualcosa di sensibilmente nome) se volevo farlo spesso. PS @ La risposta di Joshobrien è più semplice, ma lascerò questo qui perché spiega un po 'di più le cose.

+1

E sarebbe stato difficile per te spiegare di meno;). Bella risposta. (Ero andato subito a cercare la soluzione più generale per le liste annidate moltiplicate che, credo, sia 'setNames (unlist (list1, recursive = T), rapply (list1, f = names, how =" unlist ")) '--- molto simile alla tua offerta.) –