web-dev-qa-db-ja.com

複数のシートを含む複数のxlsxファイルを1つのRデータフレームに読み込みます

私は複数のxlsxファイルを読み取って1つのRデータフレームに結合する方法を読んでいて、次のようないくつかの非常に良い提案に出くわしました 特定の行と列のループを使用してRで複数のxlsxファイルを読み取る方法 =ですが、これまでのところ私のデータセットには適合していません。

Rに複数のシートを持つ複数のxlsxファイルを読み込んでもらいたい。すべてのシートとファイルの列は同じですが、長さが同じではないため、NAは除外する必要があります。最初の3行をスキップして、列1:6、8:10、12:17、19のみを取り込みたい。

これまで私が試した:

file.list <- list.files(recursive=T,pattern='*.xlsx')

dat = lapply(file.list, function(i){
    x = read.xlsx(i, sheetIndex=1, sheetName=NULL, startRow=4,
              endRow=NULL, as.data.frame=TRUE, header=F)
# Column select 
    x = x[, c(1:6,8:10,12:17,19)]
# Create column with file name  
    x$file = i
# Return data
    x
  })

  dat = do.call("rbind.data.frame", dat)

しかし、これはすべてのファイルの最初のシートすべてを取ります

すべてのシートとファイルを1つのRデータフレームにまとめる方法を知っている人はいますか?

また、大量のデータセットにはどのパッケージをお勧めしますか?これまで、readxlとXLConnectを試しました。

7
Elisah

このようなネストされたループを使用して、各ファイルの各シートを調べます。最速の解決策ではないかもしれませんが、最も簡単です。

require(xlsx)    
file.list <- list.files(recursive=T,pattern='*.xlsx')  #get files list from folder

for (i in 1:length(files.list)){                                           
  wb <- loadWorkbook(files.list[i])           #select a file & load workbook
  sheet <- getSheets(wb)                      #get sheet list

  for (j in 1:length(sheet)){ 
    tmp<-read.xlsx(files.list[i], sheetIndex=j, colIndex= c(1:6,8:10,12:17,19),
                   sheetName=NULL, startRow=4, endRow=NULL,
                   as.data.frame=TRUE, header=F)   
    if (i==1&j==1) dataset<-tmp else dataset<-rbind(dataset,tmp)   #happend to previous

  }
}

ロードフェーズの後でNA値をクリーンアップできます。

3
GPierre

これは、tidyverseおよびreadxl駆動型オプションで、ファイルの列と各ファイルのシート名を含むデータフレームを返します。

この例では、すべてのファイルに同じシートまたは列があるわけではありません。 test2.xlsxにはシートが1つだけあり、test3.xlsxsheet1にはcol3がありません。

library(tidyverse)
library(readxl)

dir_path <- "~/test_dir/"         # target directory path where the xlsx files are located. 
re_file <- "^test[0-9]\\.xlsx"    # regex pattern to match the file name format, in this case 'test1.xlsx', 'test2.xlsx' etc, but could simply be 'xlsx'.

read_sheets <- function(dir_path, file){
  xlsx_file <- paste0(dir_path, file)
  xlsx_file %>%
    Excel_sheets() %>%
    set_names() %>%
    map_df(read_Excel, path = xlsx_file, .id = 'sheet_name') %>% 
    mutate(file_name = file) %>% 
    select(file_name, sheet_name, everything())
}

df <- list.files(dir_path, re_file) %>% 
  map_df(~ read_sheets(dir_path, .))

# A tibble: 15 x 5
   file_name  sheet_name  col1  col2  col3
   <chr>      <chr>      <dbl> <dbl> <dbl>
 1 test1.xlsx Sheet1         1     2     4
 2 test1.xlsx Sheet1         3     2     3
 3 test1.xlsx Sheet1         2     4     4
 4 test1.xlsx Sheet2         3     3     1
 5 test1.xlsx Sheet2         2     2     2
 6 test1.xlsx Sheet2         4     3     4
 7 test2.xlsx Sheet1         1     3     5
 8 test2.xlsx Sheet1         4     4     3
 9 test2.xlsx Sheet1         1     2     2
10 test3.xlsx Sheet1         3     9    NA
11 test3.xlsx Sheet1         4     7    NA
12 test3.xlsx Sheet1         5     3    NA
13 test3.xlsx Sheet2         1     3     4
14 test3.xlsx Sheet2         2     5     9
15 test3.xlsx Sheet2         4     3     1
4
sbha

openxlsxソリューション:

filename <-"myFilePath"

sheets <- openxlsx::getSheetNames(filename)
SheetList <- lapply(sheets,openxlsx::read.xlsx,xlsxFile=filename)
names(SheetList) <- sheets
4
Andre Elrico

この「rio」パッケージからのもう1つの解決策:

library("rio")

# import and rbind all worksheets
DT <- import_list(SINGLE_XLSX_PATH, rbind = TRUE)

ソース: rdrr.io

0
rane