如何将一张包含多个表格的 Excel 文件拆分为单独的数据框?

Posted

技术标签:

【中文标题】如何将一张包含多个表格的 Excel 文件拆分为单独的数据框?【英文标题】:How to break out an Excel file with multiple tables in one sheet into separate data frames? 【发布时间】:2019-08-20 00:27:19 【问题描述】:

我正在导入一个 Excel 文件,其中一张工作表有多个表格。

当使用read_excel() 导入 R 时,我注意到可以通过查看 col1 将每个表与其余表分隔开:如果它包含 2-4 行 NAs 后跟一行 header ,那么接下来是一个我想存储为数据框的新表。

例如,下面的模式在文件中重复出现,每个都是单独的表:

col1         col2       col3       col4
NA           header2    header3    header4  <-- use these headers and
NA           header2a   header3a   header4a <-- append these to the above
header       Number     Number     Number   <-- omit this row
attribute1   Number     Number     Number
attribute2   Number     Number     Number
attribute3   Number     Number     Number
NA           NA         NA         NA
NA           NA         NA         NA

从上面,我想拉出headers 下面的所有内容,并仅省略NA 行(表示该表的末尾)。示例输出:

whatever     header2_header2a   header3_header3a   header4_header4a
attribute1   Number             Number             Number
attribute2   Number             Number             Number
attribute3   Number             Number             Number

最后,我想将它应用到整个文件,以便每个表都存储为自己的数据框。

这可能吗?

【问题讨论】:

【参考方案1】:

这样的事情应该可以工作:

# Find the all-NA rows, split the data, and get rid of the all-NA rows
breaks = rowSums(is.na(d)) == ncol(d)
dlist = split(d, f = data.table::rleid(breaks))
dlist = Filter(function(x) !all(is.na(x)), dlist)

# clean the remaining data
dlist = lapply(dlist, function(x) 
  nm = sapply(x[1:2, -1], paste, collapse = "_")
  x = x[-(1:2),]
  names(x) = c("whatever", nm)
  x
)
dlist
# $`1`
#     whatever header2_header2a header3_header3a header4_header4a
# 3     header           Number           Number           Number
# 4 attribute1           Number           Number           Number
# 5 attribute2           Number           Number           Number
# 6 attribute3           Number           Number           Number
# 
# $`3`
#       whatever header2b_header2bb header3b_header3bb header4b_header4bb
# 11      header             Number             Number             Number
# 12 attribute1b             Number             Number             Number
# 13 attribute2b             Number             Number             Number
# 14 attribute3b             Number             Number             Number

您可能想要进行一些排序类型转换以将列强制转换为更好的类,但由于您的示例数据只有 "number",所以我没有打扰。

使用这个输入数据:

d = read.table(text = 'col1         col2       col3       col4
NA           header2    header3    header4
NA           header2a   header3a   header4a
header       Number     Number     Number
attribute1   Number     Number     Number
attribute2   Number     Number     Number
attribute3   Number     Number     Number
NA           NA         NA         NA
NA           NA         NA         NA
NA           header2b    header3b    header4b
NA           header2bb   header3bb   header4bb
header       Number     Number     Number
attribute1b   Number     Number     Number
attribute2b   Number     Number     Number
attribute3b   Number     Number     Number
NA           NA         NA         NA
NA           NA         NA         NA', header = T)

【讨论】:

嘿@Gregor,谢谢。我遵循逻辑(非常聪明!),但我的示例数据似乎没有捕捉到我的实际数据的结构。因此,您的代码适用于示例,但不适用于我拥有的数据。我会看看我能不能让它工作;或者如果我需要分享一些数据并获得更多帮助。

以上是关于如何将一张包含多个表格的 Excel 文件拆分为单独的数据框?的主要内容,如果未能解决你的问题,请参考以下文章

将excel根据列名称拆分成多个文件

excel如何将一组数字拆成单个数字

MySQL:将一张表拆分为多张表(相同的列)以提高性能?

如何剪切/拆分大excel数据? [关闭]

Matlab中tabel如何按照日期列拆分

excel 中怎么将一串数字用格子分开