【问题标题】:Combining Vectors using a Loop使用循环组合向量
【发布时间】:2020-09-21 06:52:31
【问题描述】:

如果我有向量 m1, m2, ... m"n" 并且我想创建一个包含所有值的向量,我该怎么做?

例如:

m1 = c(0, 2, 4) 
m2 = c(1, 4)
m3 = (3)

我想要一个输出 {0, 2, 4, 1, 4, 3} 的向量“totalmods”

我的尝试,其中 nummod 是“n”,数字最大的向量是:

for(i in 1:nummod){
  totalmods <- c(paste("m",i, sep = ""))
}

感谢您的帮助!

【问题讨论】:

    标签: r loops vector


    【解决方案1】:

    您可以使用mgetunlist

    unlist(mget(ls(pattern = "^m\\d+$")), use.names = FALSE)
    # [1] 0 2 4 1 4 3
    

    我们创建一个列表,其中包含名称以“m”开头 (^m) 并以一个或多个数字 (\\d+$) 结尾的所有对象。我们使用unlist 创建一个向量。


    一位用户要求在 cmets 中设置一个基准(我开始好奇)

    x <- 2:2000
    y <- setNames(lapply(x, seq_len),  paste0("m", x))
    
    library(microbenchmark)
    microbenchmark(markus = unlist(y, use.names = FALSE),
                   tmfmnk = Reduce(c, y),
                   akrun = purrr::flatten_dbl(y)
                   times = 10L)
    #Unit: milliseconds
    #   expr       min        lq       mean    median        uq       max neval
    # markus   13.7329   13.8566   22.09223   13.9139   14.1638   75.9402    10
    # tmfmnk 3427.3571 3614.2938 3761.36990 3806.0890 3928.1482 4004.7853    10
    # akrun    42.7355   64.4865   153.8598  148.5418  240.0674  286.8956    10
    

    【讨论】:

      【解决方案2】:

      一个选项可能是:

      Reduce(c, mget(ls(pattern = "^m\\d+")))
      
      [1] 0 2 4 1 4 3
      

      【讨论】:

      • 你的答案和其他答案有什么不同吗?
      • @pagalprogrammer 我认为没有任何显着差异。这只是一个偏好问题。
      【解决方案3】:

      flatten 的选项

      library(purrr)
      mget(ls(pattern = "^m\\d+")) %>%
          flatten_dbl
      #[1] 0 2 4 1 4 3
      

      【讨论】:

        猜你喜欢
        • 2014-07-01
        • 1970-01-01
        • 2013-01-28
        • 2020-10-20
        • 1970-01-01
        • 2021-11-26
        • 1970-01-01
        • 1970-01-01
        • 2021-06-26
        相关资源
        最近更新 更多