【问题标题】:Read in Multiple Excel Files with Different Layouts in R在 R 中读取具有不同布局的多个 Excel 文件
【发布时间】:2019-11-06 17:19:37
【问题描述】:

我有十几个 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()
}

或者在数据框中搜索日期行并将其用作列名?

【问题讨论】:

  • 使用来自dplyrfilter(),并执行类似data %&gt;% filter(firstcol != "Result") 的操作(我假设该字符串存储在第一列,因为您提到您将所有内容都存储为数据框) .
  • Dunois,由于在读入数据时出现在第一行,因此它被存储为列标题。我可以看到您来自哪里,但不确定如何实现。跨度>

标签: r excel readxl openxlsx


【解决方案1】:

所以,我能想到的最简单的解决方案是这样的。

首先,使用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 循环内的第一条语句中使用了反向管道 %&lt;&gt;%(来自包 magrittr)。

注意:这将删除第一列中包含字符串“Result”的所有行。

【讨论】:

  • 没有解决整个问题,但绝对让我走上了正确的道路,谢谢。也是第一次学习使用反向管道功能,这是一个奖励。剩下的唯一问题是命名数据框,但这很复杂,因为它们有不同数量的列(不是收集这些数据的各种分析师的粉丝),但我相信我可以通过指定列数来解决这个问题在导入级别读入。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-03
  • 2012-07-27
  • 2017-07-22
  • 2014-11-04
  • 2021-09-28
  • 2021-01-01
相关资源
最近更新 更多