J'ai une seule liste de vecteurs numériques et je souhaite les combiner en un seul vecteur. Mais je suis incapable de faire ça. Cette liste peut avoir un élément commun à tous les éléments de la liste. Le vecteur final ne doit pas les ajouter deux fois. Voici un exemple:
>lst
`1`
[1] 1 2
`2`
[2] 2 4 5
`3`
[3] 5 9 1
Je veux un résultat final comme ça
>result
[1] 1 2 4 5 9 1
J'ai essayé de faire les choses suivantes, sans me soucier de la répétition:
>vec<-vector()
>sapply(lst, append,vec)
et
>vec<-vector()
>sapply(lst, c, vec)
Aucun d'entre eux a travaillé. Quelqu'un peut m'aider à ce sujet?
Merci.
Une solution plus rapide que celle proposée ci-dessus:
vec<-unlist(lst)
vec[which(c(1,diff(vec)) != 0)]
Une autre réponse en utilisant Reduce()
.
Créez la liste des vecteurs:
lst <- list(c(1,2),c(2,4,5),c(5,9,1))
Combinez-les en un seul vecteur
vec <- Reduce(c,lst)
vec
# [1] 1 2 2 4 5 5 9 1
Gardez les répétés une seule fois:
unique(Reduce(c,lst))
#[1] 1 2 4 5 9
Si vous voulez garder cette répétition à la fin, vous pouvez utiliser vec[which(c(1,diff(vec)) != 0)]
comme dans la réponse de @Rachid
Vous voulez 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
la pile le fera bien aussi, et paraît plus concise
stack(lst)$values
Le faire de façon tidyverse:
library(tidyverse)
lst %>% reduce(c) %>% unique
Ceci utilise la version reduce
(non capitalisée) de purrr en combinaison avec des pipes. Notez également que si la liste contient named vectors, la désignation finale sera différente selon que les méthodes unlist
ou reduce
sont utilisées.
Analyse comparative des deux réponses par Rachit et Martijn
rbenchmark::benchmark(
"unlist" = {
vec<-unlist(a)
vec[which(diff(vec) != 0)]
},
"reduce" = {
a %>% reduce(c) %>% unique
}
)
Sortie:
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
Ceci on bat clairement l'autre.