[英]Read in Multiple Excel Files with Different Layouts in R
我收集了十幾個 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 文件被轉發給我,頂部有一個額外的行,帶有字符串字符“結果”
現在我可以通過對每個人進行直接手術來解決這個問題:
names(data) <- rbind(data[1,])
names(data)[1] <- "X1"
data <- data[-c(1),]
但這似乎是一個相當丑陋的黑客解決方案,會導致自動化問題。 有沒有辦法使用 readWorkbook() function 但指定跳過包含某些值的行?
例如,也許是這樣的:
if value equal to 'Result' {
skipRow()
}
或者在數據框中搜索日期行並將其用作列名?
所以,我能想到的最簡單的解決方案是這樣的。
首先,使用colNames = FALSE
導入xlsx
文件,如下所示:
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")
}
請注意在 for 循環內的第一條語句中使用了反向 pipe %<>%
(來自 package magrittr
)。
注意:這將刪除第一列中包含字符串“Result”的所有行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.