【问题标题】:Read in Certain Sheets From Excel Workbook从 Excel 工作簿中读取某些工作表
【发布时间】:2018-06-21 00:44:11
【问题描述】:

我有一本包含 10 张工作表的工作簿:一半的工作表名称中包含“Survey”一词,另一半的工作表名称中包含“Census”一词。

我想阅读工作表名称中包含“调查”一词的所有工作表,并将它们附加到单独的工作簿中。

工作表名称为:WA Survey、Survey MD、DC Survey、VA Survey、Survey GA。

我有什么:

 library(XLConnect)
 wb <- loadWorkbook("Data.xls")
 dataMD <- readWorksheet(wb, sheet = "Survey MD", startCol = 1, endCol = 10)
 dataWA <- readWorksheet(wb, sheet = "Survey WA", startCol = 1, endCol = 10)
 dataDC <- readWorksheet(wb, sheet = "Survey DC", startCol = 1, endCol = 10)
 dataVA <- readWorksheet(wb, sheet = "Survey VA", startCol = 1, endCol = 10)
 dataGA <- readWorksheet(wb, sheet = "Survey GA", startCol = 1, endCol = 10)
 total <- merge(dataMD,dataWA,dataDC,dataVA,dataGA,by="ID")

我怎样才能让这更简单?我希望我能在 3-4 行内完成这项任务?

【问题讨论】:

  • 这是学校作业吗?为什么特别重要的是 4 行而不是 8 行?为什么这么重要?无论如何,如果代码正常工作并且您只想减少行数,那么问题属于Stack Exchange Code Review

标签: r excel xlsx


【解决方案1】:

您可以像这样使用 readxl 包并过滤调查数据表,然后一次性阅读所有内容。

library(readxl)

# file including path if needed
file <- "Data.xls" 
# read the sheets and only keep the Survey sheets
sheets <- excel_sheets(file)
sheets <- sheets[grep("Survey", sheets)]

# read the data, only first 10 columns (A:J)
excel_data <- lapply(sheets, read_excel, path = file, range = cell_cols("A:J") )

您最终会得到一个数据列表。如果所有列都相同,您可以使用do.call("rbind", excel_data)dplyr::bind_rows

【讨论】:

    【解决方案2】:

    您可以使用工作表名称定义一个对象,然后使用lapply 获取导入的 Excel 文件列表。

    sheets <- paste("Survey", c("MD", "WA", "DC", "VA", "GA"))
    excel.list <- lapply(sheets, function(x) 
      readWorksheetFromFile("Data.xls", sheet=x, startCol=1, endCol=10))
    

    现在您可以处理此列表以获得所需的最终 data.frame。

    当且仅当所有 Excel 工作表都包含相同顺序的相同变量时,才考虑使用 do.call(rbind, Excel.list))

    【讨论】:

    • 或者,sheets &lt;- grep("Survey", getSheets("Data.xls"), value = TRUE) 使其更通用
    猜你喜欢
    • 2011-05-17
    • 1970-01-01
    • 1970-01-01
    • 2019-10-25
    • 1970-01-01
    • 1970-01-01
    • 2023-01-26
    • 2018-08-03
    • 1970-01-01
    相关资源
    最近更新 更多