比较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 &lt;- purrr::map_df(months, ~read_excel("G:/Confidental.xlsx",sheet = .x) %&gt;% mutate_all(as.character), .id = 'months'),然后您可以使用result &lt;- 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的主要内容,如果未能解决你的问题,请参考以下文章

如何统计一个EXCEL工作薄内多张工作表的行数

如何使用 Julia 创建具有多张工作表的 excel 文件?

导入 excel .csv 文件并将其添加到 phpMyAdmin 的列中

Python:如何从一个excel文件中循环遍历多张工作表并将它们组合成一个数据框

自动获取excel表格的列类型

Python:循环遍历 Excel 工作表,将标题信息分配给每个工作表上的列,然后合并到一个文件