在 R 中读取具有不同布局的多个 Excel 文件
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 文件被转发给我,并在顶部添加了一行字符串字符 'Results'
现在我可以通过对每个人进行直接手术来解决这个问题:
names(data) <- rbind(data[1,])
names(data)[1] <- "X1"
data <- data[-c(1),]
但这似乎是一个相当丑陋的 hack 解决方案,会导致自动化问题。有没有办法使用 readWorkbook() 函数,但指定跳过包含特定值的行?
例如:
if value equal to 'Result' {
skipRow()
}
或者在数据框中搜索日期行并将其用作列名?
所以,我能想到的最简单的解决方案是这样的。
首先,使用 colNames = FALSE
导入 xlsx
文件,如下所示:
data <- files %>%
map(~readWorkbook(file.path(getwd(), .), sheet = "Sheet1", colNames = FALSE))
现在你需要做的就是
- 删除 第一行 如果它在第一列中包含 "Result"
- 将每个 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 循环内的第一个语句中反向管道 %<>%
(来自包 magrittr
)的用法。
注意:这将删除第一列中包含字符串 "Result" 的所有行。
我收集了十几个 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),]
但这似乎是一个相当丑陋的 hack 解决方案,会导致自动化问题。有没有办法使用 readWorkbook() 函数,但指定跳过包含特定值的行?
例如:
if value equal to 'Result' {
skipRow()
}
或者在数据框中搜索日期行并将其用作列名?
所以,我能想到的最简单的解决方案是这样的。
首先,使用 colNames = FALSE
导入 xlsx
文件,如下所示:
data <- files %>%
map(~readWorkbook(file.path(getwd(), .), sheet = "Sheet1", colNames = FALSE))
现在你需要做的就是
- 删除 第一行 如果它在第一列中包含 "Result"
- 将每个 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 循环内的第一个语句中反向管道 %<>%
(来自包 magrittr
)的用法。
注意:这将删除第一列中包含字符串 "Result" 的所有行。