Как сгенерировать последовательный символьный вектор без цикла? - PullRequest
2 голосов
/ 18 июня 2019

Я пытаюсь сгенерировать символьный вектор, который включает в себя последовательность из 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")

Ответы [ 4 ]

5 голосов
/ 18 июня 2019

Вот еще один способ с 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"
4 голосов
/ 18 июня 2019

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"
3 голосов
/ 18 июня 2019

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"

НЕТ пакетов

0 голосов
/ 18 июня 2019

Краткий способ:

library(purrr)

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

Создан в 2019-06-18 пакетом Представить (v0.3.0)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...