web-dev-qa-db-fra.com

R + combine une liste de vecteurs en un seul vecteur

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.

39
Rachit Agrawal

Une solution plus rapide que celle proposée ci-dessus:

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

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 

14
Paul Rougieux

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 
6
Matthew Lundberg

la pile le fera bien aussi, et paraît plus concise

stack(lst)$values
5
0mn1

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.

1
MartijnVanAttekum

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.

0
Prradep