如何在没有循环的情况下生成顺序字符向量



我正在尝试生成一个字符向量,其中包含一个由 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")

这是另一种使用 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"

1(创建一个 " 的 m x n 矩阵,并将 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"

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"

未使用软件包

简洁的方式:

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

创建于 2019-06-18 由 reprex 软件包 (v0.3.0(

最新更新