Добавить значение после каждого n-го элемента вектора в R

есть много вопросов о том, как извлечь каждый N-й элемент вектора, но я не мог найти один из того, как легко добавить значение после каждого n-го элемента вектора. Есть ли простой способ добавить определенное значение после каждого n-го элемента в векторе?

например, предположим, что у нас есть два вектора:

v1 <- paste0(letters[1:3], rep(1:5, each = 3))
> v1
[1] "a1" "b1" "c1" "a2" "b2" "c2" "a3" "b3" "c3" "a4" "b4" "c4" "a5" "b5" "c5"

v2 <- paste0("header", seq(1:5))
> v2
[1] "header1" "header2" "header3" "header4" "header5"

теперь я хочу добавить элементы v2 после каждого третьего элемента v1 начиная с первого. Результат должен выглядеть так это:

 [1] "header1" "a1" "b1" "c1" "header2" "a2" "b2" "c2" "header3" "a3" "b3" "c3" "header4" "a4" "b4" "c4" "header5" "a5" "b5" "c5"

2 ответов


вы можете сделать длинный вектор в матрицу с соответствующими размерами; вставьте заголовок сверху; а затем используйте c() чтобы сгладить матрицу обратно в вектор.

построить пример:

v1 <- paste0(letters[1:3], rep(1:5, each = 3))
v2 <- paste0("header", seq(1:5))

сделайте матрицу и прикрепите заголовок:

r <- rbind(v2,matrix(v1,ncol=length(v2)))
## "header1" "header2" "header3" "header4" "header5"
##    "a1"      "a2"      "a3"      "a4"      "a5"     
##    "b1"      "b2"      "b3"      "b4"      "b5"     
##    "c1"      "c2"      "c3"      "c4"      "c5"     

теперь сплющите его:

c(r)

у нас можете split ' v1 ' с помощью переменной группировки (созданной с помощью %/%) в виде list , затем сцепить (c) соответствующие элементы " v2 " с list используя Map и unlist его.

unlist(Map(`c`, v2, split(v1, (seq_along(v1)-1)%/%3+1)), use.names=FALSE)
#[1] "header1" "a1"      "b1"      "c1"      "header2" "a2"      "b2"     
#[8] "c2"      "header3" "a3"      "b3"      "c3"      "header4" "a4"     
#[15] "b4"      "c4"      "header5" "a5"      "b5"      "c5"  

или если длина " v1 "кратна " 3", мы можем создать matrix С 'v1',cbind 'v2', транспонировать вывод и преобразовать matrix to vector С c.

c(t(cbind(v2,matrix(v1, ncol=3, byrow=TRUE))))