ExcelファイルをRに直接読み込むにはどうすればよいですか?または、最初にデータをテキストファイルまたはCSVファイルにエクスポートし、そのファイルをRにインポートする必要がありますか?
gdata
バージョン2.8.2 xlsx
はread.xls
関数でファイルを読み取る
xlsx
xlsx / xlsm / xlsのパッケージ、xlamなどについて知らない
ExcelファイルをRに直接読み込むにはどうすればよいですか?または、最初にデータをテキストファイルまたはCSVファイルにエクスポートし、そのファイルをRにインポートする必要がありますか?
gdata
バージョン2.8.2 xlsx
はread.xls
関数でファイルを読み取る
xlsx
xlsx / xlsm / xlsのパッケージ、xlamなどについて知らない
回答:
はい。R wikiの関連ページを参照してください。短い答え:パッケージread.xls
からgdata
ほとんどの場合機能します(システムにPerlをインストールする必要がありますが、通常はMacOSとLinuxではすでに当てはまりますが、Windowsでは追加の手順を実行します(http://strawberryperl.com/を参照))。R wikiページにリストされているさまざまな警告と代替案があります。
私が直接これを行わない理由は、スプレッドシートにグリッチ(奇妙なヘッダー、複数のワークシート[一度に1つしか読み取れませんが、すべてをループすることはできますが]があるかどうかを調べることです。 、含まれるプロットなど)。しかし、単純な数値と文字データ(つまり、コンマ形式の数値、日付、ゼロ除算エラーのない数式、欠損値など)を含む整形式の長方形のスプレッドシートの場合、通常は問題ありません。このプロセスで。
na.strings="-"
問題に対処していますか?これらの問題のうちいくつが一般的で、XLConnectなどの他のツールで対処できる問題(コンマを含む数値フィールドなど)はいくつありますか?
@Chaseの推奨事項を繰り返します。XLConnectを使用します。
XLConnectを使用する理由は、私の意見では次のとおりです。
XLConnectは他のソリューションに比べて少し新しいので、ブログの投稿やリファレンスドキュメントであまり言及されていません。私にとってそれはとても役に立ちました。
readxlパッケージを使用すると、ExcelからRにデータを簡単に取得できます。既存のパッケージ(gdata、xlsx、xlsReadWriteなど)と比較して、readxlには外部の依存関係がないため、すべてのオペレーティングシステムに簡単にインストールして使用できます。1つのシートに保存されている表形式のデータを操作するように設計されています。
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
パッケージされ、順番に(Windowsの場合)Rtoolsまたは(OSX用)のXcodeが必要で、ある多くの人々は彼らが他の理由のためにインストールされているR.けれども外部の依存関係。
read_excel
ますか?と比較して速度が好きですが、read.xlsx
手動で列を文字から文字に変換する必要があるため、目的が達成されません。
2015年10月の編集:他の人がここでコメントしているように、openxlsx
およびreadxl
パッケージはxlsx
パッケージよりもはるかに高速で、実際には大きなExcelファイル(> 1500行&> 120列)を開くことができます。@MichaelChirico readxl
は、速度が優先openxlsx
され、xlsx
パッケージによって提供される機能を置き換える場合に、より優れていることを示しています。2015年にExcelファイルの読み取り、書き込み、変更を行うパッケージを探している場合は、openxlsx
ではなくを選択してくださいxlsx
。
2015年より前:私はxlsx
パッケージを使用しました。ExcelとRを使用してワークフローを変更しました。Excelシートを.txt形式で保存するかどうかを確認するのに迷惑なポップアップが表示されることはありません。パッケージはExcelファイルも書き込みます。
ただし、read.xlsx
大きなExcelファイルを開くと、機能が遅くなります。read.xlsx2
関数はかなり高速ですが、data.frame列のベクタークラスをクエリしません。関数colClasses
を使用read.xlsx2
する場合は、コマンドを使用して必要な列クラスを指定する必要があります。ここに実用的な例があります:
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)))
Excelファイルを読み取るさまざまな方法の急増とR
ここでの答えの多さを考えると、ここで言及されているオプションのどれが(いくつかの単純な状況で)最高のパフォーマンスを発揮するかを明らかにしたいと思いました。
私自身xlsx
、を使い始めて以来R
、慣れとして他に何も使用していませんでしたが、最近、どのパッケージの方が優れているかについての客観的な情報がないようです。
一部のパッケージは特定の状況を他の状況よりも適切に処理し、他の警告の滝になるため、ベンチマークの練習は困難を伴います。
そうは言っても、かなり一般的な形式(8つの文字列フィールド、3つの数値、1つの整数、3つの日付)であると思われる(再現可能な)データセットを使用しています。
set.seed(51423)
data.frame(
str1 = sample(sprintf("%010d", 1:NN)), #ID field 1
str2 = sample(sprintf("%09d", 1:NN)), #ID field 2
#varying length string field--think names/addresses, etc.
str3 =
replicate(NN, paste0(sample(LETTERS, sample(10:30, 1L), TRUE),
collapse = "")),
#factor-like string field with 50 "levels"
str4 = sprintf("%05d", sample(sample(1e5, 50L), NN, TRUE)),
#factor-like string field with 17 levels, varying length
str5 =
sample(replicate(17L, paste0(sample(LETTERS, sample(15:25, 1L), TRUE),
collapse = "")), NN, TRUE),
#lognormally distributed numeric
num1 = round(exp(rnorm(NN, mean = 6.5, sd = 1.5)), 2L),
#3 binary strings
str6 = sample(c("Y","N"), NN, TRUE),
str7 = sample(c("M","F"), NN, TRUE),
str8 = sample(c("B","W"), NN, TRUE),
#right-skewed integer
int1 = ceiling(rexp(NN)),
#dates by month
dat1 =
sample(seq(from = as.Date("2005-12-31"),
to = as.Date("2015-12-31"), by = "month"),
NN, TRUE),
dat2 =
sample(seq(from = as.Date("2005-12-31"),
to = as.Date("2015-12-31"), by = "month"),
NN, TRUE),
num2 = round(exp(rnorm(NN, mean = 6, sd = 1.5)), 2L),
#date by day
dat3 =
sample(seq(from = as.Date("2015-06-01"),
to = as.Date("2015-07-15"), by = "day"),
NN, TRUE),
#lognormal numeric that can be positive or negative
num3 =
(-1) ^ sample(2, NN, TRUE) * round(exp(rnorm(NN, mean = 6, sd = 1.5)), 2L)
)
私は、CSVファイルにこれを書いて、LibreOfficeの中で開かれたとの.xlsxファイルとして保存され、その後、パッケージの4は、このスレッドで言及したベンチマーク:xlsx
、openxlsx
、readxl
、とgdata
、デフォルトのオプションを使用して(私もかどうか、私のバージョンを試してみました列タイプを指定しますが、これはランキングを変更しませんでした)。
RODBC
Linuxを使用しているため、除外します。XLConnect
その主な目的は単一のExcelシートで読み取るのではなく、Excelブック全体をインポートすることであると思われるため、その読み取り能力のみを競い合うのは不公平に思えます。そしてxlsReadWrite
、それはもはや私のバージョンと互換性があるので、R
(と、段階的に廃止されているようです)。
次に、NN=1000L
およびNN=25000L
(data.frame
上記の各宣言の前にシードをリセットして)ベンチマークを実行し、Excelファイルサイズの違いを考慮しました。gc
は主にのためのものでxlsx
、メモリの目詰まりを引き起こす可能性があることを発見しました。さらに苦労せずに、私が見つけた結果は次のとおりです。
benchmark1k <-
microbenchmark(times = 100L,
xlsx = {xlsx::read.xlsx2(fl, sheetIndex=1); invisible(gc())},
openxlsx = {openxlsx::read.xlsx(fl); invisible(gc())},
readxl = {readxl::read_excel(fl); invisible(gc())},
gdata = {gdata::read.xls(fl); invisible(gc())})
# Unit: milliseconds
# expr min lq mean median uq max neval
# xlsx 194.1958 199.2662 214.1512 201.9063 212.7563 354.0327 100
# openxlsx 142.2074 142.9028 151.9127 143.7239 148.0940 255.0124 100
# readxl 122.0238 122.8448 132.4021 123.6964 130.2881 214.5138 100
# gdata 2004.4745 2042.0732 2087.8724 2062.5259 2116.7795 2425.6345 100
そうreadxl
で勝者であり、openxlsx
競争力とgdata
明確な敗者は。列の最小値を基準にして各測定を行います。
# expr min lq mean median uq max
# 1 xlsx 1.59 1.62 1.62 1.63 1.63 1.65
# 2 openxlsx 1.17 1.16 1.15 1.16 1.14 1.19
# 3 readxl 1.00 1.00 1.00 1.00 1.00 1.00
# 4 gdata 16.43 16.62 15.77 16.67 16.25 11.31
私のお気に入りは、にxlsx
比べて60%遅いですreadxl
。
時間がかかるため、大きなファイルで繰り返したのは20回だけでしたが、それ以外はコマンドは同じでした。これが生データです:
# Unit: milliseconds
# expr min lq mean median uq max neval
# xlsx 4451.9553 4539.4599 4738.6366 4762.1768 4941.2331 5091.0057 20
# openxlsx 962.1579 981.0613 988.5006 986.1091 992.6017 1040.4158 20
# readxl 341.0006 344.8904 347.0779 346.4518 348.9273 360.1808 20
# gdata 43860.4013 44375.6340 44848.7797 44991.2208 45251.4441 45652.0826 20
相対データは次のとおりです。
# expr min lq mean median uq max
# 1 xlsx 13.06 13.16 13.65 13.75 14.16 14.13
# 2 openxlsx 2.82 2.84 2.85 2.85 2.84 2.89
# 3 readxl 1.00 1.00 1.00 1.00 1.00 1.00
# 4 gdata 128.62 128.67 129.22 129.86 129.69 126.75
だから、readxl
それはスピードになると明確な勝者です。gdata
Excelファイルの読み込みが非常に遅く、この問題はより大きなテーブルでのみ悪化するため、別の方法で解決することをお勧めします。
二つはの描くopenxlsx
その豊富な他の方法は、(1)あるreadxl
行うように設計されただけで、おそらくそれは非常に高速である理由の一部)、特にそのある一つのこと、write.xlsx
より多くのための欠点の機能、および2)( readxl
)col_types
内の引数readxl
(としてのみをこの執筆の)いくつかの非標準を受け入れますR
:の"text"
代わりに"character"
およびの"date"
代わりに"Date"
。
XLConnect
が、非常に遅いです。私は信じているreadxl
の欠点は十分に私の最後の段落で覆われていました。そして私はとのあなたにノー似たような経験を持っていますxlsx
か、openxlsx
私は定期的に型を指定するために両方を使用するようにします。
私はうまくいきましたXLConnect
:http : //cran.r-project.org/web/packages/XLConnect/index.html
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が好きで、お勧めできます。
openxlsx
今日パッケージを試してみました。それは本当にうまく(そして高速に)働きました。
別の解決策はxlsReadWrite
パッケージです。追加のインストールは必要ありませんが、次の方法で初めて使用する前に追加のshlibをダウンロードする必要があります。
require(xlsReadWrite)
xls.getshlib()
これを忘れると、完全なフラストレーションを引き起こす可能性があります。そこにいたことすべて...
補足:テキストベースの形式(csvなど)に変換してそこから読み込むことを検討することもできます。これにはいくつかの理由があります:
ソリューション(RODBC、gdata、xlsReadWrite)が何であれ、データが変換されると奇妙なことが起こります。特に日付はかなり扱いにくい場合があります。HFWutils
パッケージは、(@Ben Bolkerさんのコメントあたり)EXCELの日付に対処するためのいくつかのツールを持っています。
大きなシートがある場合、テキストファイルでの読み取りは、EXCELからの読み取りよりも高速です。
.xlsおよび.xlsxファイルの場合、異なるソリューションが必要になる場合があります。EG xlsReadWriteパッケージは現在、.xlsx AFAIKをサポートしていません。gdata
.xlsxをサポートするには、追加のperlライブラリをインストールする必要があります。xlsx
パッケージは同じ名前の拡張機能を処理できます。
上記の他の回答の多くで述べたように、XLS / Xファイルに接続して適切な方法でデータを取得する優れたパッケージが数多くあります。ただし、どのような状況でもクリップボード(または.csv)ファイルを使用してExcelからデータを取得するべきではないことを警告する必要があります。理由を確認する=1/3
には、Excelのセルに入力してください。次に、表示される小数点の数を2に減らします。次に、データをコピーしてRに貼り付けます。CSVを保存します。どちらの場合も、Excelはインターフェイスを通じて表示されたデータのみを有効に保持しており、実際のソースデータの精度がすべて失われていることに気付くでしょう。
gnumeric::read.gnumeric.sheet
。Windowsでは100%確実ではありませんが、gdata::read.xls
うまく機能するはずです(ただしperlをインストールする必要があります)
@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)))
numeric
ためにfactors
私のコンピュータ上で。関数でをread.xlsx
使用character
してreadColumns
因子を指定します。因子を文字として取得するよりエレガントな方法があると確信していますが、機能する関数の変更バージョンを次に示しますdf.real <- read.xlsx2("filename.xlsx", 1, colClasses=gsub("factor", "character", as.vector(sapply(df.temp, class))))
。
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")