Вставьте 8 пустых (NA) столбцов в каждый четвертый столбец в кадре данных - PullRequest
0 голосов
/ 17 апреля 2020

У меня есть фрейм данных, который называется DFSpecies. Он имеет 999 строк и 80 столбцов. Мне нужно добавить 8 пустых столбцов каждый четвертый столбец.

Таким образом, результатом должно быть 4 столбца с данными из DF_Species, за которыми следуют 8 столбцов NA и так далее ...

Как я могу это сделать?

Спасибо!

Ответы [ 2 ]

0 голосов
/ 17 апреля 2020

База R Решение:

# Number of cols per 8 na_cols: n_cols => numeric vector: 
n_cols <- 4

# Number of NA vectors per n_cols: na_n_cols => numeric vector: 
na_n_cols <- 8 

# Allocate some memeory to store the split data.frame: df_list => list
df_list <- vector("list", ncol(df) / n_cols)

# Split the data.frame into ncol(df)/n data.frames in the list: df_list => list
df_list <- split.default(df, rep(1:length(df_list), each = n_cols))

# Flatten the list back into a single data.frame appending 8 NA vectors for
# every 4 original vectors: na_appended_df => data.frame
na_appended_df <-
  do.call("cbind", lapply(seq_along(df_list), function(i) {
    tmp <- data.frame(x1 <- rep(NA, nrow(df)))
    x <- cbind(df_list[[i]],
               setNames(data.frame(tmp[rep(1, each = na_n_cols)]), paste0("na_", ((
                 ((na_n_cols * i) + i - 1):(((n_na_cols * i) + i + na_n_cols + n_cols))
               )))[1:na_n_cols]))
    return(x)
  }))

Данные:

tmp <- data.frame(x1 <- rnorm(999, mean = 3.5, sd = 2))
df <-
  setNames(data.frame(tmp[rep(1, each = 80)]), paste0("x_", 1:80))
0 голосов
/ 17 апреля 2020

Это должно сработать в Base-R, у кого-то еще может быть «более чистое» решение из пакета.

DFSpecies <- cbind(DFSpecies[1:4],NA,NA,NA,NA,NA,NA,NA,NA,DFSpecies[5:80])

for(i in 1:19){
  DFSpecies <- cbind(DFSpecies[1:((i*12)+4)],NA,NA,NA,NA,NA,NA,NA,NA,DFSpecies[(i*12+1):NCOL(DFSpecies)])
  }

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