Вставка столбцов NA в определенные позиции фрейма данных в R - PullRequest
0 голосов
/ 20 января 2019

Я пытаюсь вставить столбцы NA в определенные позиции фрейма данных.

Например, у меня есть набор данных:

dataset <- data.frame(c1 = 1:5, 
                      c2 = 2:6, 
                      c3 = 3:7, 
                      c4 = 4:8, 
                      c5 = 5:9, 
                      c6 = 10:14, 
                      c7 = 15:19, 
                      c8 = 20:24, 
                      c9 = 25:29, 
                      c10 = 30:34)

Я хотел бы вставить в этом примере 4 столбца NA после каждых 2 существующих столбцов dataset.Ответ будет примерно таким:

dataset.answer <- data.frame(c1 = 1:5,  
                             c2 = 2:6,
                             c.und.1<-rep(NA,dim(dataset)[1]), 
                             c.und.1<-rep(NA,dim(dataset)[1]), 
                             c.und.1<-rep(NA,dim(dataset)[1]), 
                             c.und.1<-rep(NA,dim(dataset)[1]),
                             c3=3:7,
                             c4=4:8,
                             c.und.1<-rep(NA,dim(dataset)[1]),
                             c.und.1<-rep(NA,dim(dataset)[1]), 
                             c.und.1<-rep(NA,dim(dataset)[1]), 
                             c.und.1<-rep(NA,dim(dataset)[1]),
                             c5=5:9,
                             c6=10:14,
                             c.und.1<-rep(NA,dim(dataset)[1]),
                             c.und.1<-rep(NA,dim(dataset)[1]), 
                             c.und.1<-rep(NA,dim(dataset)[1]),
                             c.und.1<-rep(NA,dim(dataset)[1]),
                             c7=15:19,
                             c8=20:24,
                             c.und.1<-rep(NA,dim(dataset)[1]), 
                             c.und.1<-rep(NA,dim(dataset)[1]), 
                             c.und.1<-rep(NA,dim(dataset)[1]), 
                             c.und.1<-rep(NA,dim(dataset)[1]),
                             c9=25:29,
                             c10=30:34)

Любое предложение элегантного пути к нему?

Ответы [ 2 ]

0 голосов
/ 20 января 2019

Создайте второй набор данных из NA значений, затем замените соответствующие столбцы.

df <- as.data.frame(matrix(NA, nrow(dataset), 6 * ncol(dataset) / 2 - 4))
cls <- rep(seq(0, ncol(df), by = 6), each=2) + 1:2
df[cls] <- dataset
df
#   V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 V11 V12 V13 V14 V15 V16 V17 V18 V19 V20 V21 V22 V23 V24 V25 V26
# 1  1  2 NA NA NA NA  3  4 NA  NA  NA  NA   5  10  NA  NA  NA  NA  15  20  NA  NA  NA  NA  25  30
# 2  2  3 NA NA NA NA  4  5 NA  NA  NA  NA   6  11  NA  NA  NA  NA  16  21  NA  NA  NA  NA  26  31
# 3  3  4 NA NA NA NA  5  6 NA  NA  NA  NA   7  12  NA  NA  NA  NA  17  22  NA  NA  NA  NA  27  32
# 4  4  5 NA NA NA NA  6  7 NA  NA  NA  NA   8  13  NA  NA  NA  NA  18  23  NA  NA  NA  NA  28  33
# 5  5  6 NA NA NA NA  7  8 NA  NA  NA  NA   9  14  NA  NA  NA  NA  19  24  NA  NA  NA  NA  29  34

Количество столбцов 6 * ncol(dataset) / 2 -4 из df определяется как

  • 6 - 2 числовых столбца + 4 NA столбцов
  • ncol(dataset) / 2 - количество создаваемых нами «наборов»
  • - 4 - для удаления 4 NAстолбцы, которые будут добавлены в конец

Заменить имена столбцов здесь будет довольно просто с

names(df)[cls] <- names(dataset)
names(df)[-cls] <- "c.und.1"

Хотя не рекомендуется иметь несколько столбцов с одинаковым именем.

0 голосов
/ 20 января 2019

Возможно, следующее решение base R не очень элегантно, но я считаю, что оно работает.

insertNAcol <- function(DF, every = 2, na.cols = 4){
  n <- ncol(DF)
  tmp <- DF[1]
  tmp[2:(1 + na.cols)] <- NA
  tmp <- tmp[-1]
  m <- n %/% na.cols
  res <- DF[1:every]
  for(i in seq_len(m)[-1]){
    DF2 <- DF[(every*(i - 1) + 1):(every*i)]
    res <- cbind.data.frame(res, tmp, DF2)
  }
  res <- cbind(res, tmp, DF[(n - every + 1):n])
  res
}

insertNAcol(dataset)
insertNAcol(dataset, 3, 3)
...