ошибка cbind при объединении списка, содержащего пустые фреймы данных

#r #merge #cbind

#r #слияние #cbind

Вопрос:

При попытке выполнить этот код., я получил ошибку. ‘a’ — это список фреймов данных, состоящий из данных, извлеченных из файлов в b. В ‘a’ есть несколько пустых фреймов / записей данных:

 b <- list.files(path=".", pattern=".xlsx")
c <- Map(cbind, b, a) 
  

Я получил эту ошибку:

 Error in data.frame(..., check.names = FALSE) : 
  arguments imply differing number of rows: 1, 0
  

В любом случае, я могу исправить эту проблему?

Комментарии:

1. можете ли вы проверить sapply(a, dim) и sapply(b, dim)

2. Если один элемент списка пуст, хотите ли вы сохранить этот элемент списка как таковой

Ответ №1:

Если есть пустые элементы списка, мы можем их удалить

 i1 <- (sapply(b, nrow) > 0) amp; (sapply(a, nrow) > 0)
Map(cbind, b[i1], a[i1])
  

Или создайте условие внутри Map себя

 out <- Map(function(x, y) if(nrow(x) > 0 amp; nrow(y) > 0) cbind(x, y), b, a)
  

предполагая, что в противном случае соответствующие list элементы имеют одинаковое количество строк

Если нам нужно получить originaldataset в случае, если один из них пуст, мы можем сделать

 Map(function(x, y) if(is.null(x)|NROW(x) == 0) {
              y} else if(is.null(y)|NROW(y) == 0) {
              x} else cbind(x, y), 
          b, a)
  

данные

 a <- list(head(mtcars), data.frame(col1 = numeric(0)), head(iris))
b <- list(data.frame(col1 = numeric(0)), head(iris), head(mtcars))
  

Комментарии:

1. Другой возможностью (в зависимости от того, что они хотят) внутри Map() было бы if(nrow(x) == 0) {return(y)} и наоборот.

2. Я пытался Map , но получил его ошибку Error in if (nrow(x) == 0) { : argument is of length zero

3. @Jane Если вы проверите мой пример, он работает для меня

4. @@Jane Можете ли вы попробовать мою обновленную версию Map с is.null

5. @akrun сейчас это работает, но, поскольку я пытаюсь впоследствии использовать rbind, у меня возникла эта ошибка Error in rbindlist(a, fill = TRUE) : Item 2 of input is not a data.frame, data.table or list как я могу удалить эти нулевые записи, например, пункт 2?

Ответ №2:

Вы можете проверить наличие строк в a , и если они пусты cbind , два else фрейма данных возвращают исходный.

 Map(function(x, y) if (nrow(y)) cbind(x, y) else x, b, a)