微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

导入多个不整洁的 Excel 表格和变量

如何解决导入多个不整洁的 Excel 表格和变量

我正在努力导入一个大型且非常混乱的 excel 数据库。已经试过readxl之类的很多功能了,但是好像我的数据库太复杂了。

  • 我的文件中有 96 个工作表(每个是一个月,数据库包括多年)
  • 我想将它们放在一个大数据框/tibble 中
  • 列并不总是相同的。范围是每张纸 4 到 10 列。
  • 我想在每张纸上导入 4 列,但它们的标题不准确。例如。 “dob”和“出生日期”等

有人知道 readxl 或类似的解决方法来指定要导入的列吗? 喜欢在导入时提供一个要注意的向量吗? 例如。 R 中的“dob”列应包含“dob”、“出生日期”或“出生”列中的所有变量 R 中的“操作”列应包含“OP”、“操作”或“程序”等列中的所有变量...

非常感谢!来自因斯布鲁克的问候!

解决方法

由于您的输入是混乱的,您永远不会得到一个适合所有情况的解决方案。

由于您没有向我们提供任何示例数据,因此您无法从 StackOverflow 获得明确的解决方案。而且,由于你的问题的普遍性,我认为你会得到反对票和投票结束。也就是说,我认为你的问题是合理的,值得思考。

从长远来看,我会让您的供应商改过自新,并以一致的格式为您提供数据。不要说他们需要这样做,因为这会让您的生活更轻松。把它卖给他们,因为它会让你的组织更有效率,让每个人的生活更轻松:他们、你和你的供应商。

以下是我在短期内解决问题的方法...

我会编写一个函数来分别处理每个凌乱的工作簿并使其tidy。显然,这是工作的主要部分。一旦你有了它,剩下的工作就很简单了。简单地说,lapply() 您的函数到每个工作簿,然后 bind_rows() 结果。

[顺便说一句,Excel 不是数据库。但这是改天再讨论。]

处理凌乱的列名相对容易。确定要使用的列名称。还要决定如何处理缺失的列:如果列缺失,您是要添加一列 NA,报告错误还是执行其他操作?

Tidyverse 提供 rename_with(),它采用列名的字符向量并期望返回值,该值也是包含新列名的相同长度的字符向量。

所以重命名列函数可能看起来像这样:

renameFunc <- function(cols) {
  newColNames <- c()
  sapply(
    cols,function(colName) {
      newName <- case_when(
        colName == "DOB" ~ "DateOfBirth",colName == "Birth" ~ "DateOfBirth",# And do on for all possible input column names
        TRUE ~ "!! Error"
      )
      if (newName == "!! Error") stop(paste0("Unhandled column name ",colName))
      append(newColNames,newName)
    }
  )
  # Other validation: correct number of columns,add missing columns,etc
  newColNames
}

请注意错误检查:这将是您的解决方案的关键组成部分,以确保您的输入数据没有任何意外特征。

现在您可以在整理数据的函数中使用重命名函数:

tidyInputData <- function(fileName) {
  # Read the Excel file
  d <- readxl::read_excel(fileName)
  # Rename the columns
  d <- d %>% rename_with(renameFunc,everything())
  # Other processing to ensure tidy output_column
  # More error checking
  d
}

假设您有一个 Excel 文件列表(可能来自 list.files()),那么整个导入和合并过程就变成了

mergedData <- bind_rows(
                lapply(
                  fileList,tidyInputData
                )
              )

在这种过程中,我怎么强调严格错误检查的重要性都不为过。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。