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.
Eine Lösung, die schneller ist als die oben vorgeschlagene:
vec<-unlist(lst)
vec[which(c(1,diff(vec)) != 0)]
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
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
stack macht das auch schön und sieht übersichtlicher aus:
stack(lst)$values
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.
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.