代码之家  ›  专栏  ›  技术社区  ›  T Richard

组合不同长度矢量的简便方法

  •  1
  • T Richard  · 技术社区  · 3 年前

    我试图构建一个单独的向量,它包含不同长度的几个向量的元素。举个例子,让我们考虑三个向量:

    x <- rnorm(5,0,1)
    y <- rnorm(2,0,1)
    z <- rnorm(3,0,1)
    

    为了方便地完成这项工作,我使用了sapply函数,如下所示

    set.seed(123)
    vec <- sapply(c(5,2,3), function(n) rnorm(n,0,1))
    

    但这将它们列为单独的矢量

    [[1]]
    [1] -0.5605 -0.2302  1.5587  0.0705  0.1293
    
    [[2]]
    [1] 1.715 0.461
    
    [[3]]
    [1] -1.265 -0.687 -0.446
    

    有没有办法改进这个代码或应用一些其他函数,将三个向量作为一个向量,使其看起来像

    [1] -0.5605 -0.2302  1.5587  0.0705  0.1293 1.715 0.461 -1.265 -0.687 -0.446
    

    我们非常感谢您的帮助。

    2 回复  |  直到 3 年前
        1
  •  1
  •   benson23    3 年前

    我们可以使用 unlist 将列表转换为矢量。

    unlist(sapply(c(5,2,3), function(n) rnorm(n,0,1)))
    
    [1]  0.2185724 -1.4715697 -1.5881170 -0.5791368 -1.1028307
    [6] -0.5208913 -0.7065582  0.1414712  0.6883996  0.3030542
    
        2
  •  1
  •   M--    3 年前

    以下是使用的另一种方法 purrr::map_dfr :

    set.seed(123)
    purrr::map_dfr(c(5,2,3), ~data.frame(V1 = rnorm(.x, 0, 1)))$V1
    
    #>  [1] -0.56047565 -0.23017749  1.55870831  0.07050839  0.12928774  1.71506499
    #>  [7]  0.46091621 -1.26506123 -0.68685285 -0.44566197
    

    的类似解决方案 unlist 在里面 purrr :

    library(purrr)
    as_vector(map(c(5,2,3), ~rnorm(.x, 0, 1)))
    
        3
  •  1
  •   GuedesBF    3 年前

    我们也可以 Reduce 这个 c 在列表上的oncatenate函数(1), 或使用 purrr::list_c

    Reduce(c, vec)
    
    #OR#
    
    library(purrr) #(requires purrr version 1.0.0)
    
    list_c(vec)
    
     [1] -0.56047565 -0.23017749  1.55870831  0.07050839  0.12928774
     [6]  1.71506499  0.46091621 -1.26506123 -0.68685285 -0.44566197
    

    unlist 当然是你要走的路。

    推荐文章