wake-up-neo.com

R + kombiniert eine Liste von Vektoren in einem einzigen Vektor

Ich habe eine einzige Liste von numerischen Vektoren und möchte sie zu einem Vektor kombinieren. Das kann ich aber nicht. Diese Liste kann ein Element haben, das für das gesamte Listenelement gilt. Der letzte Vektor sollte sie nicht zweimal hinzufügen. Hier ist ein Beispiel:

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

Ich möchte das Endergebnis so

>result
[1] 1 2 4 5 9 1

Ich habe versucht, folgende Dinge zu tun, ohne sich um die Wiederholung zu kümmern:

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

und

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

Keiner von ihnen hat gearbeitet. Kann mir da jemand weiterhelfen?

Vielen Dank.

39
Rachit Agrawal

Eine Lösung, die schneller ist als die oben vorgeschlagene:

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

Eine andere Antwort mit Reduce().

Erstellen Sie die Liste der Vektoren:

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

Kombiniere sie zu einem Vektor

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

Behalten Sie die wiederholten nur einmal:

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

Wenn Sie das wiederholte am Ende beibehalten möchten, können Sie vec[which(c(1,diff(vec)) != 0)] wie in @ Rachids Antwort verwenden 

14
Paul Rougieux

Sie wollen 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

stack macht das auch schön und sieht übersichtlicher aus:

stack(lst)$values
5
0mn1

Auf die richtige Art und Weise:

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

Hierbei wird die (nicht kapitalisierte) reduce-Version von purrr in Kombination mit Pipes verwendet. Beachten Sie auch, dass, wenn die Liste named Vectors enthält, die endgültige Benennung davon abhängt, ob unlist- oder reduce-Methoden verwendet werden.

1

Benchmarking der beiden Antworten von Rachit und Martijn

rbenchmark::benchmark(
  "unlist" = {
    vec<-unlist(a)
    vec[which(diff(vec) != 0)]
  },
  "reduce" = {
    a %>% reduce(c) %>% unique
  }
)

Ausgabe:

    test replications elapsed relative user.self sys.self user.child sys.child
2 reduce          100   0.036        3     0.036    0.000          0         0
1 unlist          100   0.012        1     0.000    0.004          0         0

Diese eine schlug eindeutig die andere.

0
Prradep