首页 > 解决方案 > 导入多个凌乱的 Excel 工作表和变量

问题描述

我正在努力导入一个大型且非常混乱的 excel 数据库。已经尝试过很多功能,比如 readxl 等,但我的数据库似乎太复杂了。

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

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

标签: rexceldatabase-designrstudiomedical

解决方案


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

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

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

这是我在短期内解决这个问题的方法......

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

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

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

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
                )
              )

我不能过分强调这种过程中严格错误检查的重要性。


推荐阅读