r - 导入多个凌乱的 Excel 工作表和变量
问题描述
我正在努力导入一个大型且非常混乱的 excel 数据库。已经尝试过很多功能,比如 readxl 等,但我的数据库似乎太复杂了。
- 我在文件中有 96 个工作表(每个是一个月,数据库包括多年)
- 我想把它们放在一个大的数据框/小标题中
- 列并不总是相同的。范围是每张纸 4 到 10 列。
- 我想每张表导入 4 列,但它们的标题不准确。例如。“出生日期”和“出生日期”等。
有人知道 readxl 或类似的解决方法来指定要导入的列吗?就像在导入时提供要注意的向量?例如,R 中的“DOB”列应包含“DOB”、“出生日期”或“出生”列中的所有变量 R 中的“操作”列应包含“OP”、“操作”或“程序”列中的所有变量等等...
提前非常感谢!来自因斯布鲁克的问候!
解决方案
由于你的输入是混乱的,你永远不会得到一个适合所有情况的解决方案。
由于您没有向我们提供任何示例数据,因此您不会从 StackOverflow 获得明确的解决方案。而且,由于你的问题的普遍性,我认为你会得到反对票和投票结束。也就是说,我认为你的问题是合理的,值得深思。
从长远来看,我会让您的供应商改正他们的方式,并以一致的格式为您提供数据。不要说他们需要这样做,因为这会让你的生活更轻松。把它卖给他们,因为它会让你的组织更有效率,让每个人的生活更轻松:他们、你和你的供应商。
这是我在短期内解决这个问题的方法......
我会编写一个函数来分别处理每个凌乱的工作簿并使其整洁。显然,这是工作的主要部分。一旦你做到了,那么剩下的工作就很简单了。简单地说,lapply()
你对每个工作簿的功能,然后bind_rows()
是结果。
[顺便说一句,Excel 不是数据库。但这是另一天的讨论。]
处理凌乱的列名相对容易。确定要使用的列名。还要决定如何处理丢失的列:如果缺少列,是否要添加NA
s 列、报告错误或执行其他操作?
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
)
)
我不能过分强调这种过程中严格错误检查的重要性。
推荐阅读
- javascript - 在 Javascript Promise 中返回 'resolve' 函数
- ios - 故事板文件更改后如何获取新的本地化字符串
- c# - 使用 FirefoxDriver 获取页面源
- java - 如何在 Kotlin 中使用 Lambda handleHeavyContent()
- android - 更新 chrome 版本 76 后 android 应用程序崩溃
- join - spring-data-elasticsearch es6.7.2 保存子抛出异常:连接字段缺少路由
- python - 如何一次请求多个链接并稍后用scrapy解析它们?
- c++ - 在 C++17 和 emplace_back(...) 中保证复制省略
- linux - 获取映射共享内存的大小
- python - 比较特定列上的 2 个数据框