R + połącz listę wektorów w jeden wektor

Mam pojedynczą listę wektorów liczbowych i chcę je połączyć w jeden wektor. Ale nie jestem w stanie tego zrobić. Lista ta może mieć jeden element wspólny dla elementu listy. Wektor końcowy nie powinien dodawać ich dwukrotnie. Oto przykład:

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

Chcę, aby wynik końcowy był taki

>result
[1] 1 2 4 5 9 1

Próbowałem robić następujące rzeczy, nie martwiąc się o reputację:

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

I

>vec<-vector()
>sapply(lst, c, vec)
Żaden z nich nie zadziałał. Czy ktoś może mi w tym pomóc? Dzięki.
Author: Rachit Agrawal, 2013-03-20

5 answers

Rozwiązanie szybsze od zaproponowanego powyżej:

vec<-unlist(lst)
vec[which(c(1,diff(vec)) != 0)]
 39
Author: Rachit Agrawal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-05 07:00:56

Kolejna odpowiedź za pomocą Reduce().

Utwórz listę wektorów:

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

Połącz je w jeden wektor

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

Powtarzaj tylko raz:

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

Jeśli chcesz zachować ten powtórzony na końcu, możesz użyć vec[which(c(1,diff(vec)) != 0)] jak w odpowiedzi @ Rachid

 13
Author: Paul Rougieux,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-20 13:39:14

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 
 6
Author: Matthew Lundberg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-20 04:46:21

Stack też to ładnie zrobi i wygląda bardziej zwięźle:

stack(lst)$values
 4
Author: 0mn1,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-19 00:36:28

Robienie tego w tidyverse sposób:

library(tidyverse)
lst %>% reduce(c) %>% unique

To używa (uncapitalized) reduce wersja z purrr w połączeniu z rurami. Zauważ również, że jeśli lista zawiera nazwane wektory, ostateczne nazewnictwo będzie różne w zależności od tego, czy używane są metody unlist lub reduce.

 0
Author: MartijnVanAttekum,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-04 23:34:06