2013-03-20 6 views
32

У меня есть один список числового вектора, и я хочу объединить их в один вектор. Но я не могу этого сделать. Этот список может иметь один элемент, общий для элемента списка. Конечный вектор не должен добавлять их дважды. Вот пример:R + объединить список векторов в один вектор

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

Я хочу, чтобы конечный результат, как это

>result 
[1] 1 2 4 5 9 1 

Я пытался делать следующие вещи, не заботясь о repition:

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

и

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

Ни один из них рунец. Может ли кто-нибудь помочь мне в этом?

Спасибо.

+0

Спасибо @ JoshO'Brien. Но это не удаляет повторяющиеся значения. –

+0

@joran Я сомневаюсь, что «уникальный» будет достаточно мелким; 'unique' может легко удалить больше, чем 1 общий элемент между * смежными * компонентами списка. Примечание 'unique (unlist (lst))' не даст то, что хочет OP. –

+3

Вы только говорите, что не хотите, чтобы повторяющиеся значения были рядом друг с другом? Или вы говорите, что просто не хотите повторять элемент, если конец одного вектора соответствует началу следующего? Предоставление большего количества примеров могло бы помочь ... – Dason

ответ

36

Решения, которое происходит быстрее, чем предложенные выше:

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

Это быстрее, чем предложенные выше.

+4

Что такое 'vec [which (c (1, diff (vec))! = 0)]' for? – Galaxy

+4

, но это быстрее, чем предлагалось выше? – hedgedandlevered

6

Вы хотите 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

Я тоже думал об этом. Единственная проблема, с которой я сталкиваюсь, заключается в том, что я не знаю, хотят ли они удалять повторяющиеся значения в элементе списка ... – Dason

+2

Это достигается тем, что я пытаюсь сделать.Я мог бы также сделать это со следующей опцией: 'vec <-unlist (lst); vec [which (c (1, diff (vec))! = 0)] ' Теперь мне интересно, что лучше? –

+0

Это, вероятно, быстрее, так как он делает меньше работы (и быстрее на вашем тривиальном примере, на моей машине). Посмотрите на код для 'rle'. Вы можете добавить это как еще один ответ. –

4

стек будет делать это красиво тоже, и выглядит более кратким:

stack(lst)$values 
9

Другой ответ, используя Reduce().

Создать список векторов:

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

Объединить их в один вектор

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

Держите повторяющиеся из них только один раз:

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

Если вы хотите сохранить, что повторное один в конце, вы можете использовать vec[which(c(1,diff(vec)) != 0)], как в ответе @ Rachid

+0

Фактически 'unlist (lst)' проще, чем 'Reduce (c, lst)'. –