将一个电子表格中的多个表加载到R中

将一个电子表格中的多个表加载到R中,r,R,我有一个excel工作表,其中包含多个要导入R的表(作为多个数据框导入)。如果这些表存储在不同的选项卡中,我知道如何执行此操作,但我使用的原始文件将多个表放在一个选项卡中 我想知道是否有可能让R按照某种规则将每个表读入一个单独的数据帧中?假设R读取一个空行后,它会停止并将上面的所有行放入一个表中,然后重新启动进程以读取第二个表?或者我必须手动将每个表保存在单独的选项卡中,以便R读取它们 注意:我不能在read.table包中使用nrow=n,因为每个表的行可能正在更改。我需要找到一种更通用的方

我有一个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中将所有表读取到一个文件中,然后检测空行以拆分它们是更好的方法。谢谢!