如何将一张包含多个表格的 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 行 NA
s 后跟一行 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 文件拆分为单独的数据框?的主要内容,如果未能解决你的问题,请参考以下文章