【问题标题】:How to generate a sequential character vector without a loop?如何在没有循环的情况下生成顺序字符向量?
【发布时间】:2019-11-01 06:05:38
【问题描述】:

我正在尝试生成一个字符向量,其中包含 n 个数字(作为字符)的序列,每个数字元素之间有 m 个空字符串元素。

我设法使用循环生成向量。有没有办法在没有循环的情况下实现这个更简洁的方法,这会更有效吗?

sequence = character(0)
n = 3
m = 2

for(i in 1:n){
  sequence <- c(sequence, rep("",m), i)
  i <- i + 1
}

输出是一个像这样的向量:

c("","","1","","","2","","","3")

【问题讨论】:

    标签: r


    【解决方案1】:

    1)我们可以使用lapply来创建vector

    unlist(lapply(1:3, function(x) c("", "", x)))
    #[1] ""  ""  "1" ""  ""  "2" ""  ""  "3"
    

    2)rep

    replace(rep("", 9), c(FALSE, FALSE, TRUE), 1:3)
    #[1] ""  ""  "1" ""  ""  "2" ""  ""  "3"
    

    3) 或者使用repseq

    v1 <- rep("", 9)
    v1[seq(3, length(v1), by = 3)] <- 1:3
    

    4)或使用pastestrsplit

    unlist(strsplit(sprintf("  %d", 1:3), " "))
    #[1] ""  ""  "1" ""  ""  "2" ""  ""  "3"
    

    没有使用任何包

    【讨论】:

      【解决方案2】:

      这是replapply 的另一种方式。

      seq_fun <- function(n, m){
        unlist(lapply(1:n, function(x) c(rep("", times = m), x)))
      }
      
      seq_fun(3, 2)
      # [1] ""  ""  "1" ""  ""  "2" ""  ""  "3"
      

      【讨论】:

        【解决方案3】:

        1) 创建一个由 "" 组成的 m × n 矩阵,并将 rbind 1:n 绑定到它的底部。然后将其分解为向量:

        c(rbind(matrix("", m, n), 1:n))
        ## [1] ""  ""  "1" ""  ""  "2" ""  ""  "3"
        

        2) 另一种方法是创建一个 m1*n 长向量 "" 并将位置 m1*(1:n) 替换为 1:n。

        m1 <- m + 1
        replace(character(m1 * n), m1 * (1:n), 1:n)
        ## [1] ""  ""  "1" ""  ""  "2" ""  ""  "3"
        

        或者,我们可以使用逻辑第二个参数:

        replace(character(m1 * n), c(logical(m), TRUE), 1:n)
        ## [1] ""  ""  "1" ""  ""  "2" ""  ""  "3"
        

        【讨论】:

          【解决方案4】:

          简洁的方式:

          library(purrr)
          
          map2(1:3, 2, ~ c(rep("", .y), .x)) %>% unlist()
          #> [1] ""  ""  "1" ""  ""  "2" ""  ""  "3"
          

          reprex package (v0.3.0) 于 2019 年 6 月 18 日创建

          【讨论】:

            猜你喜欢
            • 2014-06-04
            • 1970-01-01
            • 2017-09-05
            • 1970-01-01
            • 2020-02-29
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多