Читайте в нескольких файлах Excel с различными форматами в R - PullRequest
2 голосов
/ 06 ноября 2019

У меня есть коллекция из десятка файлов Excel, которые я читаю, со списком фреймов данных в R со следующим кодом:

data_path <- "path"
files <- dir(data_path, pattern = "*.xlsx")

data <- files %>%
  map(~readWorkbook(file.path(data_path, .), sheet = "Results"))

С этим все без проблем. Проблема в том, что они мне нужны в одном и том же формате для дальнейшей манипуляции, и из-за неуниверсального расположения некоторые импортируются так:

X1     2016     2017     2018
y       12       12       12

, а другие как:

Result
y         2016       2017       2018
x          12         12         12

Причина в том, что некоторые файлы Excel пересылаются мне с дополнительной строкой вверху со строкой символа 'Results'

Теперь я могу исправить это с помощью прямой операции для каждого:

names(data) <- rbind(data[1,])
names(data)[1] <- "X1"
data <- data[-c(1),]

Но это выглядит довольно уродливым решением для взлома, которое приведет к проблемам с автоматизацией в будущем. Есть ли способ использовать функцию readWorkbook (), но указать, чтобы пропустить строки, если они содержат определенные значения?

например, возможно, что-то вроде:

if value equal to 'Result' {
  skipRow()
}

Или для поиска кадров данных по строкам дати использовать их в качестве имен столбцов?

1 Ответ

1 голос
/ 06 ноября 2019

Итак, самое простое решение, которое я могу придумать, это что-то вроде этого.

Сначала импортируйте xlsx файлы с colNames = FALSE, например, так:

data <- files %>%
  map(~readWorkbook(file.path(getwd(), .), sheet = "Sheet1", colNames = FALSE))

Теперь всевам нужно сделать это - удалить первую строку , если он содержит «Результат» в первом столбце - назначить каждому xlsx файлу свой собственный фрейм данных (необязательно) - установить имена столбцов для каждого из нихфайлы (необязательно)

Это можно сделать так:

for(i in 1:length(data)){
  data[[i]] %<>% filter(X1 != "Result") #Alternatively data[[i]] <- data[[i]] %>% filter(X1 != "Result")
  assign(paste0("FileName", i), as.data.frame(data[[i]]))
  names(paste0("FileName", i)) <- c("Names", "For", "Your", "Columns")
}

Обратите внимание на использование обратной трубы %<>% (из пакета magrittr) в первом операторе внутрицикл for.

Примечание : при этом удаляются все строки, содержащие строку «Результат» в первом столбце.

...