我正在尝试生成一个字符向量,其中包含一个由 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")
这是另一种使用 rep
和 lapply
的方法。
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(或将rep
与seq
一起使用
v1 <- rep("", 9)
v1[seq(3, length(v1), by = 3)] <- 1:3
4(或使用paste
和strsplit
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(