Ошибка при объединении файлов Excel в r с чистым листом - PullRequest
0 голосов
/ 07 февраля 2019

Я использую следующий код для объединения нескольких файлов Excel с несколькими листами.Я получаю сообщение об ошибке, когда он пересекает лист с тем же заголовком, что и другие файлы, но не заполнен данными.Это ошибка:

Error in data.frame(sub.id, condition, s.frame, ss) : 
  arguments imply differing number of rows: 0, 2

Как можно избежать ошибки?Вот код, который я использую ниже.

file.names <- list.files(pattern='*.xls')
sheet.names <- getSheets(loadWorkbook('File.xls'))
sheet.names <-sheet.names[1:12]
e.names <- paste0(rep('v', 16), c(1:16))

data.1 <- data.frame(matrix(rep(NA,length(e.names)),
                            ncol = length(e.names)))
names(data.1) <- e.names

for (i in 1:length(file.names)) {
  wb <- loadWorkbook(file.names[i])
  for (j in 1:length(sheet.names)) {
    ss <- readWorksheet(wb, sheet.names[j], startCol = 2, header = TRUE)
    condition <- rep(sheet.names[j], nrow(ss))
    sub.id <- rep(file.names[i], nrow(ss))
    s.frame <- seq(1:nrow(ss))
    df.1 <- data.frame(sub.id, condition, s.frame, ss)
    names(df.1) <- e.names
    data.1 <- rbind(data.1, df.1)
    rm(ss, condition, s.frame, sub.id, df.1)
  }
  rm(wb)
}

Ответы [ 2 ]

0 голосов
/ 07 февраля 2019

Добавлен оператор if для проверки наличия нескольких строк, если не пропустить чтение, и это устраняет ошибку.

for (i in 1:length(file.names)) {
  wb <- loadWorkbook(file.names[i])
  for (j in 1:length(sheet.names)) {
    ss <- readWorksheet(wb, sheet.names[j], startCol = 2, header = TRUE)
    if (nrow(ss) > 1)
    {
    condition <- rep(sheet.names[j], nrow(ss))
    sub.id <- rep(file.names[i], nrow(ss))
    s.frame <- seq(1:nrow(ss))
    df.1 <- data.frame(sub.id, condition, s.frame, ss)
    names(df.1) <- e.names
    data.1 <- rbind(data.1, df.1)
    rm(ss, condition, s.frame, sub.id, df.1)
    }
  }
  rm(wb)
}
0 голосов
/ 07 февраля 2019

Полагаю, это решение подойдет вам.Он загружает все .xlsx файлы в указанной папке в список списков.Имена листов и заголовки не должны быть проблемой.

library(openxlsx)

# Define folder where your files are
path_folder <- "C:/path_to_files/"

# load file names into a list
f <- list.files(path_folder)
f <- ifelse(substring(f,nchar(f)-4,nchar(f))==".xlsx",f,NA)
f <- f[!is.na(f)]
data_list <- as.list(f)

# get sheet-names
names(data_list) <- data_list
data_list <- lapply(data_list, function(x){getSheetNames(paste0(path_folder, x))})

# load data into a list of lists
data_list <- lapply(data_list, function(x){as.list(x)})
data_list <- lapply(names(data_list),function(x){
  sapply(data_list[[x]],function(y){read.xlsx(paste0(path_folder, x),sheet=y)})
})

# name the list elements
names(data_list) <- gsub(".xlsx", "", f)

В итоге вы получите список (содержащий каждый файл) списков (содержащий листы каждого файла).Отсюда вы можете удалять пустые листы, объединять и редактировать их по своему усмотрению.

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