2013-03-20 23 views
32

Tôi có một danh sách các vector số và tôi muốn kết hợp chúng thành một vectơ. Nhưng tôi không thể làm điều đó. Danh sách này có thể có một phần tử phổ biến trên phần tử danh sách. Vector cuối cùng không được thêm hai lần. Dưới đây là một ví dụ:R + kết hợp danh sách các vectơ vào một vector đơn

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

Tôi muốn kết quả cuối cùng như thế này

>result 
[1] 1 2 4 5 9 1 

tôi đã cố gắng làm những điều sau đây, mà không lo lắng về repition:

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

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

Không ai trong số họ lo ked. Có ai có thể giúp tôi với cái này?

Cảm ơn.

+0

Cảm ơn @ JoshO'Brien. Nhưng điều đó không loại bỏ các giá trị trùng lặp. –

+0

@joran Tôi nghi ngờ 'unique' sẽ đủ hạt mịn; 'unique' có thể dễ dàng loại bỏ nhiều hơn 1 phần tử phổ biến giữa các thành phần danh sách * liền kề *. Lưu ý 'unique (unlist (lst))' sẽ không cung cấp những gì OP muốn. –

+3

Bạn có nói rằng bạn không muốn có bất kỳ giá trị lặp lại nào ngay cạnh nhau không? Hay bạn đang nói bạn chỉ không muốn lặp lại một phần tử nếu kết thúc của một vectơ khớp với sự bắt đầu của phần tiếp theo? Cung cấp nhiều ví dụ hơn có thể giúp ... – Dason

Trả lời

36

Một giải pháp đó là nhanh hơn so với một đề xuất ở trên:

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

Đây là nhanh hơn so với một đề xuất ở trên.

+4

'vec [cái gì (c (1, khác biệt (vec))! = 0)]' cho? – Galaxy

+4

nhưng nhanh hơn đề xuất ở trên? – hedgedandlevered

6

Bạn muốn 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

Tôi cũng đang nghĩ về điều này. Một trong những vấn đề tôi có là tôi không biết nếu họ muốn loại bỏ các giá trị lặp đi lặp lại trong một yếu tố danh sách ... – Dason

+2

Điều này đạt được những gì tôi đang cố gắng để làm.Tôi cũng có thể làm điều đó với tùy chọn sau: 'vec <-unlist (lst); vec [mà (c (1, diff (vec))! = 0)] ' Bây giờ tôi tự hỏi cái nào tốt hơn? –

+0

Đó có thể là nhanh hơn vì nó đang làm việc ít hơn (và nhanh hơn trên ví dụ tầm thường của bạn, trên máy tính của tôi). Nhìn vào mã cho 'rle'. Bạn có thể thêm câu trả lời đó làm câu trả lời khác. –

4

ngăn xếp sẽ làm điều này độc đáo quá, và trông ngắn gọn hơn:

stack(lst)$values 
9

câu trả lời khác sử dụng Reduce().

Tạo danh sách các vectơ:

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

Kết hợp chúng thành một vector

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

Giữ những người lặp đi lặp lại một lần duy nhất:

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

Nếu bạn muốn giữ lại mà lặp đi lặp lại một ở cuối, Bạn có thể muốn sử dụng vec[which(c(1,diff(vec)) != 0)] như trong câu trả lời của @ Rachid

+0

Trong thực tế, 'unlist (lst)' dễ hơn 'Reduce (c, lst)'. –

Các vấn đề liên quan