【问题标题】:Reading excel file into R and Merging all the sheets in it into a single dataframe将excel文件读入R并将其中的所有工作表合并到一个数据框中
【发布时间】:2014-10-25 13:42:29
【问题描述】:

我有一张 Excel 表格,里面有不同数量的表格(它可以有 2 张或 3 张表格,或者仅取决于用户)。 所有工作表的标题都相同。 (前两行被视为标题)

我想合并所有这些工作表并将其放入一个数据框中。

文件为 .xlsx 格式。并且每张表都包含大量行(30 列和 8000 行)。

我是在 R 中阅读 excel 文件的初学者。我正在阅读它们,同时如果有人知道如何实现这一点,请告诉我。

Excel 工作表的示例类似于 Data

PS:我想用闪亮的方式实现这一切。所以,请务必提及是否有任何有效的闪亮方法。

ui.R

fileInput('file2', h5('Choose Your Observation Data'), accept=c('text/csv','text/comma-separated-values,text/plain','.xlsx'))

server.R

b <- reactive({
   fileinput2 <- input$file2
   if (is.null(fileinput2))
   return(NULL)
   #xlfile <- list.files(pattern = ".xlsx")
   xlfile <- fileinput2[1]
   wb <- loadWorkbook(xl_file)
   sheet_ct <- wb$getNumberOfSheets()
   b <- rbindlist(pblapply(1:sheet_ct, function(x) {
     res <- read.xlsx(xl_file, x)
   }), fill=TRUE)
   b <- b [-c(1),]
   print (b)
   })

【问题讨论】:

    标签: r excel shiny


    【解决方案1】:

    您可以从A million ways to connect R and Excel 开始。这是一个基本的 sn-p,可让您进一步使用 xlsx 包。它是基于 java 的,而且速度很慢,因此使用了进度条。

    这个 sn-p 采用了一种非常幼稚的方法,因为我见过的每个真实世界的 Excel 电子表格通常都是一堆令人讨厌的疯狂数字,而且很少能保证所有列都正确排列且名称一致。为此,我肆意使用data.table中的rbindlistfill选项来处理任何列不一致。

    结果并不完美(您需要注意额外的标题行),但您正在从 Excel 中读取,这也远非完美。

    library(xlsx)        # excel reading
    library(pbapply)     # free progress bars
    library(data.table)  # rbindlist
    
    xl_file <- "Data.xlsx"
    
    wb <- loadWorkbook(xl_file)
    sheet_ct <- wb$getNumberOfSheets()
    
    dat <- rbindlist(pblapply(1:sheet_ct, function(x) {
      res <- read.xlsx(xl_file, x)
    }), fill=TRUE)
    
    head(dat)
    ##    EN MN  ED   HO    TM    SL   PH        DI      TA   DI.1     CH     PI
    ## 1:  #  # day hour  degC    NA   NA    µmol/L µmol/kg µmol/L   µg/L µmol/L
    ## 2:  1  1   1   12   9.9 31.23 7.82 2126.1575    2151   15.3   0.93     NA
    ## 3:  1  1   2   36  9.59 31.17 7.84 2120.4175    2150   14.2 1.2044   0.69
    ## 4:  1  1   3   60  9.65 31.13 7.84  2110.885    2143   14.3 0.9137   2.85
    ## 5:  1  1   4   84 10.36 31.16 7.83 2105.4525    2137   13.8 0.7189   7.29
    ## 6:  1  1   5  108 10.06 31.13 7.84 2106.4775    2139   13.7  0.317   5.24
    ##        PO     PN     PP     DC     DN     DP     TP Exp.num Mesocosm
    ## 1: µmol/L µmol/L µmol/L µmol/L µmol/L µmol/L µmol/L      NA       NA
    ## 2:     NA  2.319  0.032  100.4     NA     NA 5.6306      NA       NA
    ## 3:  24.16  2.598  0.048  104.5     NA     NA 2.3034      NA       NA
    ## 4: 34.815  2.095  0.059     NA     NA     NA 2.5594      NA       NA
    ## 5: 40.999  2.186  0.056   97.5     NA     NA 5.8865      NA       NA
    ## 6: 37.751  2.173  0.081     NA     NA     NA 6.1425      NA       NA
    ##    Exp.day Hour Temperature Salinity pH DIC DIN Chl.a PIC POC PON POP DOC
    ## 1:      NA   NA          NA       NA NA  NA  NA    NA  NA  NA  NA  NA  NA
    ## 2:      NA   NA          NA       NA NA  NA  NA    NA  NA  NA  NA  NA  NA
    ## 3:      NA   NA          NA       NA NA  NA  NA    NA  NA  NA  NA  NA  NA
    ## 4:      NA   NA          NA       NA NA  NA  NA    NA  NA  NA  NA  NA  NA
    ## 5:      NA   NA          NA       NA NA  NA  NA    NA  NA  NA  NA  NA  NA
    ## 6:      NA   NA          NA       NA NA  NA  NA    NA  NA  NA  NA  NA  NA
    ##    DON DOP TEP
    ## 1:  NA  NA  NA
    ## 2:  NA  NA  NA
    ## 3:  NA  NA  NA
    ## 4:  NA  NA  NA
    ## 5:  NA  NA  NA
    ## 6:  NA  NA  NA
    

    另一种方法是batch convert your Excel files to CSV,从长远来看,它可能更有效。

    【讨论】:

    • 特别同意convert to csv部分!
    • 完美运行。但是考虑到我在闪亮上实现这个需要很多时间。还有一件事……即使控制台上的进度条正在加载,闪亮的 GUI 上的上传栏状态也只是显示其已完成。我已在我的问题中添加了必要的代码,请检查。
    • 我认为您可能希望将问题的闪亮部分分解为另一个问题。此外,这开始成为“为我编写项目”的问题。如果xlsx 包太慢,您可以使用我提供的链接中的其他方法。如果您让人们上传 Excel 文件,则上传栏将与控制台进度栏分开。您可以随时在闪亮的应用程序中添加separate progress message/bar
    • 我只是想知道,您的解决方案提供了一个 data.frames 列表,每张数据表 1 个。我只想知道如何生成包含所有数据的单个列表?有可能吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-15
    • 1970-01-01
    • 1970-01-01
    • 2022-12-06
    • 1970-01-01
    • 1970-01-01
    • 2019-08-25
    相关资源
    最近更新 更多