将一个电子表格中的多个表加载到R中
我有一个excel工作表,其中包含多个要导入R的表(作为多个数据框导入)。如果这些表存储在不同的选项卡中,我知道如何执行此操作,但我使用的原始文件将多个表放在一个选项卡中 我想知道是否有可能让R按照某种规则将每个表读入一个单独的数据帧中?假设R读取一个空行后,它会停止并将上面的所有行放入一个表中,然后重新启动进程以读取第二个表?或者我必须手动将每个表保存在单独的选项卡中,以便R读取它们 注意:我不能在read.table包中使用nrow=n,因为每个表的行可能正在更改。我需要找到一种更通用的方法,使整个过程自动进行,而不考虑每个表的结构将一个电子表格中的多个表加载到R中,r,R,我有一个excel工作表,其中包含多个要导入R的表(作为多个数据框导入)。如果这些表存储在不同的选项卡中,我知道如何执行此操作,但我使用的原始文件将多个表放在一个选项卡中 我想知道是否有可能让R按照某种规则将每个表读入一个单独的数据帧中?假设R读取一个空行后,它会停止并将上面的所有行放入一个表中,然后重新启动进程以读取第二个表?或者我必须手动将每个表保存在单独的选项卡中,以便R读取它们 注意:我不能在read.table包中使用nrow=n,因为每个表的行可能正在更改。我需要找到一种更通用的方
任何想法都值得赞赏。谢谢大家! 您能否手动
将每个表复制/粘贴到它自己的选项卡中,然后将每个选项卡导出到CSV或TSV中?这是我通常会做的
如果这是太多的工作,那么@joran的建议可能会奏效。您可以使用stringr::str_detect()
识别列或行何时为空或不为空,然后将该信息插入startRow
,startCol
,endRow
,endCol
参数 如果您的工作表中确实有空白行分隔,您可以尝试将每个选项卡作为一个大表读取,然后以这种方式拆分
library(tidyverse)
library(readxl)
# read the whole thing into a single file
wholeworksheet <- read_excel('myfile.xlsx')
# find the blank rows
blankrows <- data_frame(
blanks = which(is.na(wholeworksheet[1]))
) %>%
mutate(
dif = blanks - lag(blanks)
, rownum = row_number()
# maybe someone can suggest a better way to handle using dplyr::lag()
, startrow = ifelse(rownum == 1, 1, NA)
, startrow = coalesce(ifelse(dif == 1, lag(startrow, default =1), lag(blanks + 1)), 1)
)
# get the end rows of each table
endrows <- blankrows %>%
group_by(startrow) %>%
summarize(
endrow = min(blanks)
)
# combine start and end rows into a single table
tableindex <- blankrows %>%
left_join(endrows, by = 'startrow') %>%
distinct(startrow, endrow)
# the last blank row is probably just before the last table in the sheet
if(nrow(wholeworksheet) > max(blankrows$blanks)) {
lasttable <- data_frame(startrow = max(blankrows$blanks) + 1, endrow = nrow(wholeworksheet))
tableindex <- tableindex %>%
bind_rows(lasttable)
}
# split your tables up into a list of tables
alistoftables <- map(1:nrow(tableindex), ~ wholeworksheet[tableindex$startrow[.x]:tableindex$endrow[.x] , ] )
库(tidyverse)
图书馆(readxl)
#把整件事读成一个文件
整体工作表%
总结(
endrow=最小值(空白)
)
#将起始行和结束行合并到一个表中
表格索引%
左联合(尾行,by='startrow')%>%
不同(开始、结束行)
#最后一个空行可能就在工作表中最后一个表的前面
如果(nrow(整个工作表)>最大值(空白行$blanks)){
lasttable一些基于Java的Excel软件包已经矢量化了startRow
,startCol
,endRow
,endCol
参数,这些参数允许您指定不同的矩形区域来读取.XLConnect,例如。@joran谢谢!但问题是每个表的位置可能会随着时间的推移而改变,因为没有。行的数量不是固定的。实际上每一行都代表一个日期,因此表将每周更新更多的行。那么我应该如何指定开始行和结束行呢?坦白地说,将整个数据帧读入一个数据帧,然后通过寻找空行将其拆分到R中可能会更简单。@Joran感谢您或者建议。我想我可能会同意你的建议,先将所有表加载到R中,然后使用字符串检测将其拆分。谢谢!是的,我认为你是对的。可能先在R中将所有表读取到一个文件中,然后检测空行以拆分它们是更好的方法。谢谢!