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

时间:2017-12-04 16:29:45

标签: r

我有一个excel工作表,其中包含我要导入R的多个表(导入为多个数据框)。我知道如果这些表存储在不同的选项卡中,如何这样做,但我正在使用的原始文件在一个选项卡中放置了几个表。

Part view of my spreadsheet

我想知道是否有可能让R通过某个规则将每个表读入一个单独的数据帧?假设一旦R读取一个空行,它就会停止并将所有上面的行放入一个表中,然后重新启动进程以读取第二个表?或者我必须在单独的选项卡中手动保存每个表以让R读取它们?

注意:我无法在 read.table 包中使用 nrow = n ,因为每个表的行可能正在更改。无论每个表的结构如何,我都需要找到一种更通用的方法来自动完成整个过程。

任何想法都表示赞赏。谢谢!

2 个答案:

答案 0 :(得分:1)

如果您可靠地有空白行来分隔您的工作表,您可以尝试将每个选项卡作为一个大表读取,然后将其拆分。

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] , ]  )

答案 1 :(得分:0)

您是否可以将每个表格copy/paste放入其自己的标签中,然后将每个标签导出为CSV或TSV?这就是我通常会做的事情。

如果这是太多的工作,那么@joran的建议可能会奏效。您可以使用stringr::str_detect()标识列或行何时为空或不为空,然后将该信息插入startRowstartColendRowendCol参数。