2013-03-20 20 views
32

Ho una singola lista di vettore numerico e voglio combinarli in un vettore. Ma non sono in grado di farlo. Questo elenco può avere un elemento comune attraverso l'elemento dell'elenco. Il vettore finale non dovrebbe aggiungerli due volte. Ecco un esempio:R + combina un elenco di vettori in un singolo vettore

>lst 
`1` 
[1] 1 2 
`2` 
[2] 2 4 5 
`3` 
[3] 5 9 1 

Voglio risultato finale in quanto questo

>result 
[1] 1 2 4 5 9 1 

Ho provato a fare seguenti cose, senza preoccuparsi della repition:

>vec<-vector() 
>sapply(lst, append,vec) 

e

>vec<-vector() 
>sapply(lst, c, vec) 

Nessuno di loro è preoccupato ked. Qualcuno può aiutarmi su questo?

Grazie.

+0

Grazie @ JoshO'Brien. Ma ciò non rimuove i valori duplicati. –

+0

@joran Dubito che 'unique' sarà abbastanza fine; 'unique' potrebbe facilmente rimuovere più di 1 elemento comune tra componenti * adiacenti * dell'elenco. Nota 'unique (unlist (lst))' non darebbe quello che l'OP vuole. –

+3

Stai solo dicendo che non vuoi valori ripetuti l'uno accanto all'altro? O stai dicendo che non vuoi ripetere un elemento se la fine di un vettore corrisponde all'inizio del prossimo? Fornire più esempi potrebbe aiutare ... – Dason

risposta

36

Una soluzione che è più veloce di quella proposta di cui sopra:

vec<-unlist(lst) 
vec[which(c(1,diff(vec)) != 0)] 

Questo è più veloce di quella proposta di cui sopra.

+4

Cos'è 'vec [quale (c (1, diff (vec))! = 0)]' per? – Galaxy

+4

ma è più veloce di quello sopra proposto? – hedgedandlevered

6

Volete rle:

rle(unlist(lst))$values 

> lst <- list(`1`=1:2, `2`=c(2,4,5), `3`=c(5,9,1)) 
> rle(unlist(lst))$values 
## 11 21 22 31 32 33 
## 1 2 4 5 9 1 
+0

Stavo pensando anche a questo. L'unico problema che ho è che non so se vorrebbero rimuovere i valori ripetuti all'interno di un elemento della lista ... – Dason

+2

Raggiungere ciò che sto cercando di fare.Potrei anche farlo con la seguente opzione: 'vec <-unlist (lst); vec [quale (c (1, diff (vec))! = 0)] ' Ora mi chiedo quale sia il migliore? –

+0

Probabilmente è più veloce perché fa meno lavoro (ed è più veloce nel tuo esempio banale, sulla mia macchina). Guarda il codice per 'rle'. Potresti aggiungerlo come un'altra risposta. –

4

pila farà questo bene troppo, e sembra più concisa:

stack(lst)$values 
9

Un'altra risposta utilizzando Reduce().

creare l'elenco di vettori:

lst <- list(c(1,2),c(2,4,5),c(5,9,1)) 

combinarle in un vettore

vec <- Reduce(c,lst) 
vec 
# [1] 1 2 2 4 5 5 9 1 

mantenere quelli ripetuto una sola volta:

unique(Reduce(c,lst)) 
#[1] 1 2 4 5 9 

Se si desidera mantenere che ripete uno alla fine, potresti voler usare vec[which(c(1,diff(vec)) != 0)] come nella risposta di @ Rachid

+0

In effetti 'unlist (lst)' è più facile di 'Reduce (c, lst)'. –