Вот один из вариантов.Основываясь на вводе / выводе, нам нужно иметь альтернативные столбцы в каждом блоке из 2 столбцов, создать матрицу 'm1' имен столбцов, split
их на col
матрицы, объединить каждый элемент list
с однимэлемента 'df2' для создания вектора имен столбцов в указанном порядке ('un1').Используя это, создается data.frame для NA (через маршрут matrix
), и ему присваиваются значения столбцов df
m1 <- matrix(names(df), 2, 2)
un1 <- c(unlist(Map(c, df2[seq_len(nrow(m1))],
split(m1, col(m1)))), df2[length(df2)])
dfN <- as.data.frame(matrix(NA, ncol =length(un1),
nrow = nrow(df), dimnames = list(NULL, un1)))
dfN[names(df)] <- df
dfN
# ee aa bb ff cc dd gg
#1 NA a a NA a a NA
#2 NA b b NA b b NA
#3 NA c c NA c c NA
#4 NA d d NA d d NA
#5 NA e e NA e e NA
. Или другой вариант: add_column
от tibble
.Мы split
набор данных в list
из data.frame
на основе 'k' (блоки столбца - 2), перебираем list
и последовательность list
с map2
, добавляем столбцыв начале (add_column
) преобразуйте его в один data.frame (map2_dfc
), а затем добавьте оставшийся столбец в конце
library(tidyverse)
k <- 2
l1 <- split.default(df, as.integer(gl(ncol(df), k, ncol(df))))
i1 <- seq_along(l1)
nm1 <- tail(names(df), 1)
l1 %>%
map2_dfc(., i1, ~
.x %>%
add_column(!! df2[.y] := NA, .before = 1)) %>%
add_column(!!df2[-i1] := NA, .after = nm1)
# ee aa bb ff cc dd gg
#1 NA a a NA a a NA
#2 NA b b NA b b NA
#3 NA c c NA c c NA
#4 NA d d NA d d NA
#5 NA e e NA e e NA