Альтернативный пустой столбец среди данных - PullRequest
1 голос
/ 27 марта 2019

У меня есть df:

df = data.frame(aa = letters[1:5],
                bb = letters[1:5],
                cc = letters[1:5],
                dd = letters[1:5])
df2 = c('ee', 'ff', 'gg')
df[df2] = NA

И я хочу получить такой вывод:

ee  aa  bb  ff  cc  dd  gg
NA  a   a   NA  a   a   NA
NA  b   b   NA  b   b   NA
NA  c   c   NA  c   c   NA
NA  d   d   NA  d   d   NA
NA  e   e   NA  e   e   NA

Есть ли элегантный способ сделать это вместо:

df = df[,c('ee', 'aa', 'bb', 'ff', 'cc', 'dd', 'gg')] ??

Ответы [ 2 ]

2 голосов
/ 27 марта 2019

Если имена пустых столбцов не имеют большого значения, вы также можете использовать цикл for.Это приведет к желаемому кадру данных с именем df2

df = data.frame(aa = letters[1:5],
                bb = letters[1:5],
                cc = letters[1:5],
                dd = letters[1:5])
df2 = NA

for (i in 1:(ncol(df) / 2)) {
  df2 <- data.frame(df2, df[, (i*2-1):(i*2)], NA)
}

Имена столбцов могут быть добавлены позже при необходимости как

colnames(df2)[seq(1,ncol(df2),3)] <- c('ee', 'ff', 'gg')
2 голосов
/ 27 марта 2019

Вот один из вариантов.Основываясь на вводе / выводе, нам нужно иметь альтернативные столбцы в каждом блоке из 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...