2017-12-04 2 views
0

Rにインポートする複数の表を含むExcelワークシートがあります(複数のデータフレームとしてインポートする)。私はそれらのテーブルが別のタブに格納されているが、私が使用しているrawファイルが複数のテーブルを1つのタブに入れている場合、その方法を知っています。私は思ったんだけど複数の表を1つのスプレッドシートにロードするR

Part view of my spreadsheet

は、Rは、一定のルールによって別のデータフレームに各テーブルを読み込む持っている可能性がありますか? Rが空白の行を読み込むと、上のすべての行が停止して1つの表に置かれたとし、2番目の表を読み取るためにプロセスを再起動します。あるいは、Rに読み込ませるために、別々のタブに各テーブルを手動で保存する必要がありますか?

注:各テーブルの行が変更されるかもしれないように、私はread.tableをパッケージにnrow = Nを使用することはできません。私は、各テーブルの構造に関係なく、プロセス全体を自動的に行うためのより普遍的な方法を見つける必要があります。

ご了承ください。ありがとうございました!

+1

JavaベースのExcelのパッケージのいくつかは、あなたが読むために明確な矩形領域を指定することができます 'startRow'、' startCol'、 'endRow'、' endCol'引数をベクトル化しています。例えば、XLConnect。 – joran

+0

@joranありがとうございます!しかし、事は各テーブルの場所が時間の経過とともに変更される可能性があります。行の行は固定されていません。実際には各行は日付を表しているため、テーブルは毎週追加される行が増えて更新されます。では、startRowとendRowをどのように指定するのですか? –

+1

確かに、1つのデータフレームにすべてを読み込んだ後、空の行を探してRで分割する方が簡単かもしれません。 – joran

答えて

0

手動でcopy/paste各テーブルを独自のタブにして、各タブをCSVまたはTSVにエクスポートできますか?それが私が普通にやることです。

あまりにも多くの作業がある場合は、@ joranの提案が有効です。 stringr::str_detect()を使用して、列または行が空であるか空でないかを識別し、その情報をstartRow,startColendRowendColのパラメータにプラグインすることができます。

+0

いや、あなたは正しいと思います。おそらくR内のすべてのテーブルを1つのファイルに読み込み、それを分割する空の行を検出する方が良い方法でしょう。ありがとうございました! –

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] , ] ) 
関連する問題