2013-03-20 26 views
32

Mam jedną listę wektorów numerycznych i chcę połączyć je w jeden wektor. Ale nie jestem w stanie tego zrobić. Ta lista może zawierać jeden element wspólny dla elementu listy. Ostateczny wektor nie powinien ich dodawać dwa razy. Oto przykład:R + połącz listę wektorów w jeden wektor

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

chcę końcowy wynik jak to

>result 
[1] 1 2 4 5 9 1 

Próbowałem robić następujące rzeczy, bez martwienia się o repition:

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

i

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

Żadne z nich wor ked. Czy ktoś może mi w tym pomóc?

Dzięki.

+0

Dzięki @ JoshO'Brien. Ale to nie usuwa zduplikowanych wartości. –

+0

@joran Wątpię, że 'unique' będzie wystarczająco drobnoziarnisty; 'unique' może całkiem łatwo usunąć więcej niż 1 wspólny element między * sąsiadującymi * elementami listy. Uwaga 'unique (unlist (lst))' nie daje tego, co chce OP. –

+3

Po prostu mówisz, że nie chcesz żadnych powtarzających się wartości tuż obok siebie? Czy możesz powiedzieć, że po prostu nie chcesz powtarzać elementu, jeśli koniec jednego wektora pasuje do początku następnego? Zapewnienie więcej przykładów może pomóc ... – Dason

Odpowiedz

36

Rozwiązanie, które jest szybsze niż jednej proponowanej powyżej:

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

To szybciej niż jednej proponowanej powyżej.

+4

Co to jest "vec [który (c (1, diff (vec))! = 0)]" for? – Galaxy

+4

, ale czy jest to szybsze rozwiązanie niż proponowane powyżej? – hedgedandlevered

6

Chcesz 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

Myślałem o tym również. Mam tylko jeden problem: nie wiem, czy chcieliby usunąć powtarzające się wartości w elemencie listy ... – Dason

+2

Osiągnę to, co próbuję zrobić.Mogę też zrobić to z następującą opcją: 'vec <-unlist (lst); vec [który (c (1, diff (vec))! = 0)] ' Teraz zastanawiam się, który jest lepszy? –

+0

To prawdopodobnie szybciej, ponieważ wykonuje mniej pracy (i jest szybszy na twoim prostym przykładzie, na moim komputerze). Spójrz na kod 'rle'. Możesz to dodać jako inną odpowiedź. –

4

stos zrobi to zbyt ładnie, i wygląda bardziej zwięzły:

stack(lst)$values 
9

Inna odpowiedź za pomocą Reduce().

Stwórz listę wektorów:

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

połączyć je w jednym wektorze

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

przechowywać powtarzające się te tylko raz:

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

Jeśli chcesz zachować to powtórzone jeden na końcu, możesz użyć vec[which(c(1,diff(vec)) != 0)], jak w @ Rachid's odpowiedź

+0

W rzeczywistości 'unlist (lst)' jest łatwiejsze niż 'Reduce (c, lst)'. –