我有一个excel工作表,其中包含我要导入R的多个表(导入为多个数据框)。我知道如果这些表存储在不同的选项卡中,如何这样做,但我正在使用的原始文件在一个选项卡中放置了几个表。
我想知道是否有可能让R通过某个规则将每个表读入一个单独的数据帧?假设一旦R读取一个空行,它就会停止并将所有上面的行放入一个表中,然后重新启动进程以读取第二个表?或者我必须在单独的选项卡中手动保存每个表以让R读取它们?
注意:我无法在 read.table 包中使用 nrow = n ,因为每个表的行可能正在更改。无论每个表的结构如何,我都需要找到一种更通用的方法来自动完成整个过程。
任何想法都表示赞赏。谢谢!
答案 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()
标识列或行何时为空或不为空,然后将该信息插入startRow
,startCol
,endRow
,endCol
参数。