如何解决导入多个不整洁的 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 举报,一经查实,本站将立刻删除。