R + combine a list of vectors into a single vector

62,288

Solution 1

A solution that is faster than the one proposed above:

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

Solution 2

Another answer using Reduce().

Create the list of vectors:

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

Combine them into one vector

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

Keep the repeated ones only once:

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

If you want to keep that repeated one at the end, You might want to use vec[which(c(1,diff(vec)) != 0)] as in @Rachid's answer

Solution 3

You want 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 

Solution 4

stack will do this nicely too, and looks more concise:

stack(lst)$values

Solution 5

Benchmarking the two answers by Rachit and Martijn

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

Output:

    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

This one clearly beat the other one.

Share:
62,288
Rachit Agrawal
Author by

Rachit Agrawal

Love coding.

Updated on July 08, 2022

Comments

  • Rachit Agrawal
    Rachit Agrawal almost 2 years

    I have a single list of numeric vector and I want to combine them into one vector. But I am unable to do that. This list can have one element common across the list element. Final vector should not add them twice. Here is an example:

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

    I want final result as this

    >result
    [1] 1 2 4 5 9 1
    

    I tried doing following things, without worrying about the repition:

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

    and

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

    None of them worked. Can someone help me on this?

    Thanks.