2017-10-03 7 views
1
require(purrr) 
require(xlsx) 

私は多くのシートを含むExcelワークブックを読んでいます。各シートには1つのオブジェクトのデータが含まれているので、すべてのシートを読み込み、2つの変換を適用してから、rbindをすべて一緒に読み込もうとしています。マップを使用してエラーを返すExcelシートのリストに関数を適用する

私はすべてのデータが1列にあるので、私はfieldnamesvaluesに分割するために正規表現を使用して変換するために、このヘルパー関数を書きました:

dfTransform <-function(sheet){ 
    fieldnames <- apply(sheet,2,function(x) gsub("(^.*?):.*","\\1",x)) 
    values <- apply(sheet,2,function(x) gsub("(^.*?:\\s)","",x)) 
    df <- data.frame(fieldnames,values) 
    df$name <- sheets[sheet] 
    return(df) 
} 

は、シート名を取得し、その後、使用したExcelシートを読み込みますlapply

wb <- loadWorkbook(path) 

sheets <- names(getSheets(wb)) 

x <- lapply(sheets,function(x) read.xlsx("C://Users/591043/Desktop/EmployeeBGData.xlsx",x,header=F)) 

のでxは、データフレームのリストです。

Error in sheets[sheet] : invalid subscript type 'list'

誰もが間違って何が起こっているのかを知っている:

今、私は単に

x %>% map(dfTransform) 
    %>% reduce(rbind) 

しかしmap(dfTransform)はエラーをスローすることができ、ここからだと思いますか?

私は実際のデータを提供することができません。このためのお詫びは再現可能な例ではありません。これで問題を解決するには十分ではない場合、私は試していくつか生成することができます。

+1

'sheets'はリストです。あなたは 'sheets [[sheet]]'が必要です。また、rbindlistよりもはるかに高速であり、これらの種類の作業に対応しやすいrbindlistを参照することをお勧めします。 – shreyasgm

+0

は 'map_df'を使うかもしれません –

答えて

0

解決策には2つの部分があります。まず、ファイルを読み込んだときにデータフレームのリストにシート名を割り当てる必要があることに気付きました。

私はカスタムの "read excel"関数を定義して、各データフレームに列としてシート名を追加しました。

readXLfile <- function(x){ 
    xlfile <- read.xlsx("path",x,header=F) 
    xlfile$name <- x 
    return(xlffile) 
} 

使用lapplyシートに読むために:

fileList <- lapply(sheets, function(x) readXLfile(x)) 

を第二の問題は、dfTransform関数内applyを使用することによって引き起こされているように見えました。私は単独でgsubfieldnamesvaluesベクトルを作成することによって簡略化:

fieldnames <- gsub("(^.*?):.*","\\1",sheet$X1) 
values <- gsub("(^.*?:\\s)","",sheet$X1) 

予想通りfileListpurrr::map(dfTransform)に実行を渡し、これらの変更を行った後。

関連する問題