#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)