R + combine a list of vectors into a single vector

后端 未结 6 777
死守一世寂寞
死守一世寂寞 2021-01-30 10:37

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. Fin

相关标签:
6条回答
  • 2021-01-30 10:44

    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

    0 讨论(0)
  • 2021-01-30 10:48

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

    stack(lst)$values
    
    0 讨论(0)
  • 2021-01-30 10:49

    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.

    0 讨论(0)
  • 2021-01-30 10:51

    Doing it the tidyverse way:

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

    This uses the (uncapitalized) reduce version from purrr in combination with pipes. Also note that if the list contains named vectors, the final naming will be different depending on whether unlist or reduce methods are used.

    0 讨论(0)
  • 2021-01-30 10:54

    A solution that is faster than the one proposed above:

    vec<-unlist(lst)
    vec[which(c(1,diff(vec)) != 0)]
    
    0 讨论(0)
  • 2021-01-30 11:05

    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 
    
    0 讨论(0)
提交回复
热议问题