比较excel文件中多张工作表的列标题并将其提取到R
Posted
技术标签:
【中文标题】比较excel文件中多张工作表的列标题并将其提取到R【英文标题】:Comparing column headers from multiple sheets in an excel file and fetch it to R 【发布时间】:2020-11-04 23:22:38 【问题描述】:所以我有一个 excel 文件,其中包含我必须合并的几张表中的数据,以便我可以从中提供见解:
这些表以从 11 月 .....10 月开始的每个月命名(共:12 张)
我的代码是这样开始的:
#List of months to look at
months = c("Novemeber", "December", "January", "February", "March", "April", "May", "June", "July", "August", "September")
我想要做的是将这些工作表中的每一个的列名与一个空的 df 匹配(我称之为差异),并相应地将数据提取到这些列。我的代码是这样的
discrepancies <-
setNames(
data.frame(matrix(ncol = 12, nrow = 0)),
c(
"Date",
"Officer",
"Case Number",
"Account Number",
"Plan Type",
"Type",
"ID",
"Transaction Amount",
"Code",
"Specialist",
"Transit#",
"Processed Via"
)
)
#Query for each month's data and append to the main dataframe
for (i in months)
temp <- read_excel(
"G:/Confidental.xlsx",
sheet = i,
col_names = TRUE,
skip = 0
)
temp$`months` <- i
discrepancies <- rbind(discrepancies, temp)
此代码将工作表中的每个字段与我想要的列进行比较,当一张表的列数与差异 df 中的列数不同时,它会卡住。任何帮助表示赞赏。
【问题讨论】:
每个 excel 表中的所有“差异”列总是存在,或者是否存在某些情况下它们可能会丢失? 后者,有些可能会丢失。但是不会有列在 12 列窗口之外 我对这个问题的回答可能会有用:***.com/questions/64506027/… 【参考方案1】:我认为您不需要创建一个空数据框来比较所有列。试试这个方法:
library(readxl)
result <- purrr::map_df(months, ~read_excel("G:/Confidental.xlsx",sheet = .x),
.id = 'months')
这将合并在一个数据框上的所有工作表中。如果工作表中缺少某些列,则会自动为当月的这些列插入 NA
。
【讨论】:
谢谢!这就是我需要的 你知道我为什么会收到这个错误吗?错误:无法组合1$Case Number
5$Case Number
result <- purrr::map_df(months, ~read_excel("G:/Confidental.xlsx",sheet = .x) %>% mutate_all(as.character), .id = 'months')
,然后您可以使用result <- type.convert(result)
更改为相应的类型。【参考方案2】:
一个可能的解决方案是按照这个例子的思路:
# verification data.frame
descrepancies <- data.frame(Col1=character(),
Col2=character(),
Col3=character())
# test 1: one column missing
df1 <- data.frame(Col1= c(1,1),
Col3= c(1,1))
# test 2: one column that is not in discrepancies
df2 <- data.frame(Col1= c(2,2),
Col4= c(2,2))
# text 3: all columns are matching
df3 <- data.frame(Col1= c(3,3),
Col2= c(3,3),
Col3= c(3,3))
我使用的步骤是从测试 data.frame 中获取列名,为不在测试 data.frame 中但存在差异的列创建新列,从测试 data.frame 中选择所有存在差异的列。我只运行了 3 次以检查所有案例并安装最后一个 df 以证明它正在工作
# get column names from descrepancies to check the tests
nd <- colnames(descrepancies)
# run procedure on test 1
nf1 <- colnames(df1)
df1[, nd[!nd %in% nf1]] <- NA
descrepancies <- rbind(descrepancies, df1[, nd])
# run procedure on test 2
nf2 <- colnames(df2)
df2[, nd[!nd %in% nf2]] <- NA
descrepancies <- rbind(descrepancies, df2[, nd])
# run procedure on test 3
nf3 <- colnames(df3)
df3[, nd[!nd %in% nf3]] <- NA
descrepancies <- rbind(descrepancies, df3[, nd])
# print the final df
descrepancies
Col1 Col2 Col3
1 1 NA 1
2 1 NA 1
3 2 NA NA
4 2 NA NA
5 3 3 3
6 3 3 3
【讨论】:
以上是关于比较excel文件中多张工作表的列标题并将其提取到R的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Julia 创建具有多张工作表的 excel 文件?
导入 excel .csv 文件并将其添加到 phpMyAdmin 的列中