web-dev-qa-db-ja.com

RスクリプトからExcelファイルを直接読み取る

ExcelファイルをRに直接読み込むにはどうすればよいですか?または、最初にデータをテキストファイルまたはCSVファイルにエクスポートし、そのファイルをRにインポートする必要がありますか?

93
waanders

はい。 R wikiの関連ページ を参照してください。簡単な答え:gdataパッケージのread.xlsはほとんどの場合動作します(システムにPerlをインストールする必要がありますが、通常はMacOSおよびLinuxで既に当てはまりますが、Windowsでは追加の手順を実行しますが、すなわち http://strawberryperl.com/ )を参照してください。 R wikiページにリストされているさまざまな警告と代替があります。

私がこれを直接行わない唯一の理由は、スプレッドシートをチェックして、グリッチ(奇妙なヘッダー、複数のワークシート[一度に1つしか読むことができませんが、明らかにすべてをループすることができます] 、含まれるプロットなど)。しかし、普通の数字と文字データ(つまり、コンマ形式の数字、日付、ゼロ除算エラー、欠損値などの式ではないなど)を含む、整形式の長方形のスプレッドシートの場合、通常は問題ありません。このプロセスで。

40
Ben Bolker

@Chaseが推奨したことを繰り返してみましょう: XLConnect を使用します。

私の意見では、XLConnectを使用する理由は次のとおりです。

  1. クロスプラットフォーム。 XLConnectはJavaで記述されているため、Rコードを変更せずにWin、Linux、Macで実行できます(パス文字列を除く)
  2. ロードするものは他にありません。 XLConnectをインストールするだけで、人生を始めることができます。
  3. Excelファイルの読み取りについてのみ言及しましたが、XLConnectはセルの書式設定の変更を含むExcelファイルも書き込みます。そして、Winだけでなく、LinuxまたはMacからこれを行います。

XLConnectは他のソリューションと比べてやや新しいため、ブログ投稿やリファレンスドキュメントで言及される頻度は少なくなります。私にとっては非常に便利です。

48
JD Long

そして今 readxl があります:

Readxlパッケージを使用すると、ExcelからRにデータを簡単に取得できます。既存のパッケージ(gdata、xlsx、xlsReadWriteなど)と比較して、readxlには外部依存関係がないため、すべてのオペレーティングシステムに簡単にインストールして使用できます。これは、単一のシートに保存されている表形式のデータで動作するように設計されています。

readxlはlibxls Cライブラリの上に構築され、基盤となるバイナリ形式の複雑さの多くを抽象化します。

従来の.xls形式と.xlsxの両方をサポートしています

readxlはCRANから入手できます。または、githubから次のコマンドでインストールできます。

# install.packages("devtools")
devtools::install_github("hadley/readxl")

使用法

library(readxl)

# read_Excel reads both xls and xlsx files
read_Excel("my-old-spreadsheet.xls")
read_Excel("my-new-spreadsheet.xlsx")

# Specify sheet with a number or name
read_Excel("my-spreadsheet.xls", sheet = "data")
read_Excel("my-spreadsheet.xls", sheet = 2)

# If NAs are represented by something other than blank cells,
# set the na argument
read_Excel("my-spreadsheet.xls", na = "NA")

説明には「外部依存関係なし」と書かれていますが、 Rcpp package が必要であり、Rtools(Windowsの場合)またはXcode(OSXの場合)が必要ですareRの外部の依存関係。多くの人が他の理由でそれらをインストールしています。

44
Ben

EDIT 2015-October:他の人がここでコメントしているように openxlsxreadxl パッケージは群を抜いてxlsxパッケージよりも高速で、実際には大きなExcelファイル(> 1500行&> 120列)を開くことができます。 @MichaelChiricoは、速度が優先され、readxlopenxlsxパッケージによって提供される機能を置き換える場合、xlsxの方が優れていることを示しています。 2015年にExcelファイルの読み取り、書き込み、および変更を行うパッケージを探している場合は、openxlsxではなくxlsxを選択してください。

2015年以前:私は xlsxpackage を使用しました。 ExcelとRでワークフローが変更されました。Excelシートを.txt形式で保存するかどうかを確認するポップアップが表示されることはなくなりました。パッケージはExcelファイルも書き込みます。

ただし、大きなExcelファイルを開くと、read.xlsx関数が遅くなります。 read.xlsx2関数はかなり高速ですが、data.frame列のベクトルクラスを照会しません。 read.xlsx2関数を使用する場合は、colClassesコマンドを使用して目的の列クラスを指定する必要があります。実用的な例を次に示します。

read.xlsx("filename.xlsx", 1)はファイルを読み取り、data.frame列クラスをほぼ有用にしますが、大きなデータセットの場合は非常に遅くなります。 .xlsファイルでも機能します。

read.xlsx2("filename.xlsx", 1)は高速ですが、列クラスを手動で定義する必要があります。ショートカットは、コマンドを2回実行することです(以下の例を参照)。 character指定は、列を因子に変換します。時間にはDateおよびPOSIXctオプションを使用します。

coln <- function(x){y <- rbind(seq(1,ncol(x))); colnames(y) <- colnames(x)
rownames(y) <- "col.number"; return(y)} # A function to see column numbers

data <- read.xlsx2("filename.xlsx", 1) # Open the file 

coln(data)    # Check the column numbers you want to have as factors

x <- 3 # Say you want columns 1-3 as factors, the rest numeric

data <- read.xlsx2("filename.xlsx", 1, colClasses= c(rep("character", x),
rep("numeric", ncol(data)-x+1)))
28
Mikko

私はXLConnectで幸運に恵まれました: http://cran.r-project.org/web/packages/XLConnect/index.html

19
Chase
library(RODBC)
file.name <- "file.xls"
sheet.name <- "Sheet Name"

## Connect to Excel File Pull and Format Data
Excel.connect <- odbcConnectExcel(file.name)
dat <- sqlFetch(Excel.connect, sheet.name, na.strings=c("","-"))
odbcClose(Excel.connect)

個人的に、私はRODBCが好きで、それをお勧めできます。

12

パッケージopenxlsxを今日試してみました。それは本当にうまく(そして高速に)働きました。

http://cran.r-project.org/web/packages/openxlsx/index.html

7
Chris

別の解決策は xlsReadWrite パッケージです。これは追加のインストールを必要としませんが、最初に使用する前に追加のshlibをダウンロードする必要があります。

require(xlsReadWrite)
xls.getshlib()

これを忘れると、完全なフラストレーションが生じます。そこに行って...

補足:テキストベースの形式(csvなど)への変換を検討し、そこから読み込むことをお勧めします。これにはいくつかの理由があります:

  • ソリューション(RODBC、gdata、xlsReadWrite)に関係なく、データが変換されると奇妙なことが起こります。特に日付はかなり面倒です。 HFWutilsパッケージには、Excelの日付を処理するツールがいくつかあります(@Ben Bolkerのコメントによる)。

  • 大きなシートがある場合、テキストファイルの読み取りはExcelからの読み取りよりも高速です。

  • .xlsおよび.xlsxファイルの場合、異なるソリューションが必要になる場合があります。例えば、xlsReadWriteパッケージは現在.xlsx AFAIKをサポートしていません。 gdataでは、.xlsxをサポートするために追加のPerlライブラリをインストールする必要があります。 xlsx パッケージは同じ名前の拡張子を処理できます。

5
Joris Meys

他の多くの回答で前述したように、XLS/Xファイルに接続して合理的な方法でデータを取得する多くの優れたパッケージがあります。ただし、どのような状況でも、クリップボード(または.csv)ファイルを使用してExcelからデータを取得しないでください。理由を確認するには、Excelのセルに=1/3と入力します。次に、表示される小数点の数を2に減らします。次に、データをコピーしてRに貼り付けます。CSVを保存します。どちらの場合でも、Excelはインターフェイスを通じて表示されるデータのみを保持し、実際のソースデータの精度がすべて失われていることに気付くでしょう。

4
russellpierce

@Mikkoが提供する答えを拡張すると、きちんとしたトリックを使用して、事前に列のクラスを「知る」必要なく、速度を上げることができます。単にread.xlsxを使用して、限られた数のレコードを取得してクラスを決定し、その後にread.xlsx2を続けます。

# just the first 50 rows should do...
df.temp <- read.xlsx("filename.xlsx", 1, startRow=1, endRow=50) 
df.real <- read.xlsx2("filename.xlsx", 1, 
                      colClasses=as.vector(sapply(df.temp, mode)))
3
JasonAizkalns

Excelファイルは、次のようにRに直接読み込むことができます。

my_data <- read.table(file = "xxxxxx.xls", sep = "\t", header=TRUE)

Readxlパッケージを使用したxlsおよびxlxsファイルの読み取り

library("readxl")
my_data <- read_Excel("xxxxx.xls")
my_data <- read_Excel("xxxxx.xlsx")