Условное добавление столбцов в список фреймов данных

У меня есть список фреймов данных с 2 или 4 столбцами.

a <- data.frame(a=1:10,
                b=1:10,
                c=1:10,
                d=1:10)

b <- data.frame(a=1:10,
                b=1:10)

list_of_df <- list(a,b)

Я хочу добавить 2 пустых столбца в каждый фрейм данных только с 2 столбцами.

Я пробовал этот подход:

lapply(list_of_df, function(x) ifelse(ncol(x) < 4,x%>%add_column(empty=NA),x <- x))

Который не работает, к сожалению. Как я могу это исправить?

3 метода стилизации элементов HTML
3 метода стилизации элементов HTML
Когда дело доходит до применения какого-либо стиля к нашему HTML, существует три подхода: встроенный, внутренний и внешний. Предпочтительным обычно...
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
0
0
21
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Я бы использовал цикл for, чтобы не копировать весь список:

for (i in seq_along(list_of_df)) {
  n_columns = ncol(list_of_df[[i]]) 
  if (n_columns == 2L) { 
    list_of_df[[i]][c('empty1', 'empty2')] <- NA
  }
}

Результат:

> list_of_df
[[1]]
    a  b  c  d
1   1  1  1  1
2   2  2  2  2
3   3  3  3  3
4   4  4  4  4
5   5  5  5  5
6   6  6  6  6
7   7  7  7  7
8   8  8  8  8
9   9  9  9  9
10 10 10 10 10

[[2]]
    a  b empty1 empty2
1   1  1     NA     NA
2   2  2     NA     NA
3   3  3     NA     NA
4   4  4     NA     NA
5   5  5     NA     NA
6   6  6     NA     NA
7   7  7     NA     NA
8   8  8     NA     NA
9   9  9     NA     NA
10 10 10     NA     NA
Ответ принят как подходящий

Я придумал что-то похожее:

add_col <- function(x){
  col_to_add <- 4 - ncol(x)
  if(col_to_add == 0) return(x)
  z <- rep(NA, nrow(x))
  for (i in 1:col_to_add){
    x <- cbind(x, z)
  }
  x
}

lapply(list_of_df, add_col)

Мы могли бы использовать bind_rows, а затем group_split и map из purrr, чтобы удалить столбец id_Group:

library(dplyr)
library(purrr)

bind_rows(list_of_df) %>% 
  group_split(id_Group =cumsum(a==1)) %>% 
  map(., ~ (.x %>% ungroup() %>% 
              select(-id_Group)))
[[1]]
# A tibble: 10 x 4
       a     b     c     d
   <int> <int> <int> <int>
 1     1     1     1     1
 2     2     2     2     2
 3     3     3     3     3
 4     4     4     4     4
 5     5     5     5     5
 6     6     6     6     6
 7     7     7     7     7
 8     8     8     8     8
 9     9     9     9     9
10    10    10    10    10

[[2]]
# A tibble: 10 x 4
       a     b     c     d
   <int> <int> <int> <int>
 1     1     1    NA    NA
 2     2     2    NA    NA
 3     3     3    NA    NA
 4     4     4    NA    NA
 5     5     5    NA    NA
 6     6     6    NA    NA
 7     7     7    NA    NA
 8     8     8    NA    NA
 9     9     9    NA    NA
10    10    10    NA    NA

Другие вопросы по теме