Lesen Sie eine Excel-Datei direkt aus einem R-Skript
95
Wie kann ich eine Excel-Datei direkt in R lesen? Oder sollte ich zuerst die Daten in eine Text- oder CSV-Datei exportieren und diese Datei in R importieren?
@Sacha Epskamp: Mit xlsReadWrite müssen Sie nicht einmal Perl installieren.
Joris Meys
1
gdataVersion 2.8.2 liest xlsxDateien mit der read.xlsFunktion
Ben
1
Siehe meine Warnung (als Antwort unten) bezüglich des möglichen Genauigkeitsverlusts, wenn Sie die Daten aus Excel in ein Textformat exportieren.
Russellpierce
1
xlsxPaket für xlsx / xlsm / xls, weiß nicht über xlam usw.
Qbik
2
"Ich sehe nie einen Grund, nicht zuerst in eine Textdatei zu exportieren". Wie wäre es damit: Wenn ich nach CSV exportiere, wird eines der Felder, die ich benötige, nicht geschrieben. Es scheint eine Art DRM zu sein, aber da ich die Tabelle nicht geschrieben habe, weiß ich es nicht.
Nate Reed
Antworten:
41
Ja. Siehe die entsprechende Seite im R-Wiki . Kurze Antwort: read.xlsDas gdataPaket funktioniert die meiste Zeit (obwohl Perl auf Ihrem System installiert sein muss - normalerweise bereits unter MacOS und Linux, aber unter Windows ein zusätzlicher Schritt, siehe http://strawberryperl.com/). ). Auf der R-Wiki-Seite sind verschiedene Vorbehalte und Alternativen aufgeführt.
Der einzige Grund, warum ich dies nicht direkt sehe, ist, dass Sie die Tabelle möglicherweise untersuchen möchten, um festzustellen, ob sie Störungen aufweist (seltsame Überschriften, mehrere Arbeitsblätter [Sie können jeweils nur eine lesen, obwohl Sie offensichtlich alle durchlaufen können] , einschließlich Grundstücke usw.). Aber für eine wohlgeformte, rechteckige Tabelle mit einfachen Zahlen und Zeichendaten (dh nicht durch Kommas formatierten Zahlen, Datumsangaben, Formeln mit Fehlern beim Teilen durch Null, fehlenden Werten usw. usw.) habe ich im Allgemeinen kein Problem mit diesem Prozess.
Es gibt viele potenzielle Probleme, auf die ich persönlich gestoßen bin. Felder mit Zahlen mit Komma müssen entfernt und in R in Zahlen umgewandelt werden. Felder mit "-" müssen in NA umcodiert werden. Die allgemeine Empfehlung ist, Ihre Zahlen in Excel wirklich zu betrachten und sicherzustellen, dass sie korrekt in R übersetzt werden.
Brandon Bertelsen
3
Sie können nicht mit "Sie müssen sich wirklich Ihre Zahlen ansehen" argumentieren ... was ist das Problem mit "-" Feldern? nicht mit na.strings="-"dem Problem? Wie viele dieser Probleme sind generisch und wie viele (z. B. numerische Felder mit Kommas) können mit anderen Tools wie XLConnect ... behoben werden?
Ben Bolker
1
Dieser Kommentar richtete sich an das OP, nicht an dich, Ben, meine Schuld an der schlechten Platzierung.
Brandon Bertelsen
1
Relevante Anekdote: read.xlsErfolg in ein sehr großes Blatt aus einer Excel - Datei zu lesen , wo beide XLConnectund xlsxscheiterte (ich glaube , weil sie beide verlassen sich auf Apache POI )
Matt Parker
49
Lassen Sie mich noch einmal wiederholen, was @Chase empfohlen hat: Verwenden Sie XLConnect .
Die Gründe für die Verwendung von XLConnect sind meiner Meinung nach:
Plattformübergreifend. XLConnect ist in Java geschrieben und kann daher unter Win, Linux, Mac ohne Änderung Ihres R-Codes ausgeführt werden (außer möglicherweise Pfadzeichenfolgen).
Sonst nichts zu laden. Installieren Sie einfach XLConnect und fahren Sie mit dem Leben fort.
Sie haben nur das Lesen von Excel-Dateien erwähnt, aber XLConnect schreibt auch Excel-Dateien, einschließlich der Änderung der Zellenformatierung. Und das unter Linux oder Mac, nicht nur unter Win.
XLConnect ist im Vergleich zu anderen Lösungen etwas neu und wird daher in Blog-Posts und Referenzdokumenten seltener erwähnt. Für mich war es sehr nützlich.
Das readxl-Paket erleichtert das Abrufen von Daten aus Excel in R. Im Vergleich zu den vorhandenen Paketen (z. B. gdata, xlsx, xlsReadWrite usw.) weist readxl keine externen Abhängigkeiten auf, sodass die Installation und Verwendung auf allen Betriebssystemen einfach ist. Es wurde entwickelt, um mit tabellarischen Daten zu arbeiten, die in einem einzigen Blatt gespeichert sind.
readxl basiert auf der libxls C-Bibliothek, die viele der Komplexitäten des zugrunde liegenden Binärformats abstrahiert.
Es unterstützt sowohl das ältere XLS-Format als auch XLSX
readxl ist bei CRAN erhältlich, oder Sie können es von github installieren mit:
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")
Beachten Sie, dass in der Beschreibung zwar "keine externen Abhängigkeiten" angegeben ist, jedoch das RcppPaket erforderlich ist , für das wiederum Rtools (für Windows) oder Xcode (für OSX) erforderlich sind , die Abhängigkeiten außerhalb von R sind. Viele Benutzer haben sie jedoch aus anderen Gründen installiert .
Viel schneller als xlsx. Die Lesezeit ist wie bei read.xlsx2, es werden jedoch Typen abgeleitet.
Steve Rowe
1
@SteveRowe sehen neue Antwort für einige (versuchte) objektive Benchmarks, die dies bestätigen
MichaelChirico
Gibt es eine Möglichkeit, Zeichenfolgen als Faktoren zu lesen read_excel? Ich mag die Geschwindigkeit im Vergleich zu read.xlsx, aber wenn man Spalten manuell von Zeichen in Faktoren konvertieren muss, ist der Zweck zunichte.
Coip
2
+1 für die Tatsache, dass es keine Abhängigkeiten hat. Ich hasse es, Java installieren zu müssen. Und ich habe es versucht und es funktioniert sehr gut für mich.
Bastian
2
readxl und openxlsx sind die besten. readxl ist schneller, erlaubt aber kein Schreiben. Auf jeden Fall funktioniert keiner von ihnen gut, wenn versucht wird, Spaltenklassen / -typen anzugeben.
Skan
29
EDIT 2015-Oktober: Wie andere hier kommentiert haben, sind die openxlsxund readxl-Pakete bei weitem schneller als das xlsxPaket und schaffen es tatsächlich, größere Excel-Dateien (> 1500 Zeilen &> 120 Spalten) zu öffnen. @MichaelChirico zeigt, dass dies readxlbesser ist, wenn Geschwindigkeit bevorzugt wird, und openxlsxersetzt die vom xlsxPaket bereitgestellten Funktionen . Wenn Sie nach einem Paket zum Lesen, Schreiben und Ändern von Excel-Dateien im Jahr 2015 suchen, wählen Sie das openxlsxanstelle von xlsx.
Vor 2015: Ich habe xlsxPaket verwendet . Es hat meinen Workflow mit Excel und R geändert. Keine nervigen Popups mehr, die fragen, ob ich sicher bin, dass ich meine Excel-Tabelle im TXT-Format speichern möchte. Das Paket schreibt auch Excel-Dateien.
Allerdings finde ich die read.xlsxFunktion beim Öffnen großer Excel-Dateien langsam. read.xlsx2Die Funktion ist erheblich schneller, stellt jedoch die Vektorklasse der data.frame-Spalten nicht in Frage. Sie müssen den colClassesBefehl verwenden, um die gewünschten Spaltenklassen anzugeben, wenn Sie die read.xlsx2Funktion verwenden. Hier ist ein praktisches Beispiel:
read.xlsx("filename.xlsx", 1)Liest Ihre Datei und macht die Spaltenklassen data.frame nahezu nützlich, ist jedoch für große Datenmengen sehr langsam. Funktioniert auch für .xlsDateien.
read.xlsx2("filename.xlsx", 1)ist schneller, aber Sie müssen Spaltenklassen manuell definieren. Eine Verknüpfung besteht darin, den Befehl zweimal auszuführen (siehe das folgende Beispiel). characterDie Spezifikation konvertiert Ihre Spalten in Faktoren. Verwendung Dateund POSIXctOptionen für die Zeit.
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)))
Angesichts der RVielzahl unterschiedlicher Möglichkeiten zum Einlesen einer Excel-Datei und der Vielzahl von Antworten hier dachte ich, ich würde versuchen, etwas Licht ins Dunkel zu bringen, welche der hier genannten Optionen (in einigen einfachen Situationen) die beste Leistung erbringt.
Ich selbst habe es verwendet, xlsxseit ich angefangen habe R, für Trägheit, wenn nichts anderes, und ich habe kürzlich bemerkt, dass es keine objektiven Informationen darüber zu geben scheint, welches Paket besser funktioniert.
Jede Benchmarking-Übung ist mit Schwierigkeiten behaftet, da einige Pakete bestimmte Situationen mit Sicherheit besser bewältigen als andere und ein Wasserfall mit anderen Einschränkungen.
Trotzdem verwende ich einen (reproduzierbaren) Datensatz, der meiner Meinung nach in einem ziemlich gebräuchlichen Format vorliegt (8 Zeichenfolgenfelder, 3 numerische, 1 Ganzzahl, 3 Datumsangaben):
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))
Ich schrieb dann diese zu csv und eröffnen in Libreoffice und speicherte es als XLSX - Datei, dann gebenchmarkt 4 der in diesem Thread erwähnten Pakete: xlsx, openxlsx, readxl, und gdata, um die Standardoptionen (Ich habe auch versucht , eine Version von , ob ich Geben Sie die Spaltentypen an, dies hat jedoch die Rangfolge nicht geändert.
Ich schließe aus, RODBCweil ich unter Linux bin. XLConnectweil es den Anschein hat, dass sein Hauptzweck nicht darin besteht, einzelne Excel-Tabellen zu lesen, sondern ganze Excel-Arbeitsmappen zu importieren, scheint es unfair, sein Pferd nur mit seinen Lesefähigkeiten ins Rennen zu bringen; und xlsReadWriteweil es nicht mehr mit meiner Version von kompatibel ist R(scheint auslaufen).
Ich habe dann Benchmarks mit NN=1000Lund NN=25000L(Zurücksetzen des Startwerts vor jeder Deklaration der data.frameoben genannten) ausgeführt, um Unterschiede in Bezug auf die Größe der Excel-Datei zu berücksichtigen. gcist in erster Linie für xlsx, die ich manchmal gefunden habe, kann Speicher Clogs erstellen. Hier sind ohne weiteres die Ergebnisse, die ich gefunden habe:
Wir sehen meinen eigenen Favoriten, xlsxist 60% langsamer als readxl.
Excel-Datei mit 25.000 Zeilen
Aufgrund des Zeitaufwands habe ich nur 20 Wiederholungen für die größere Datei durchgeführt, ansonsten waren die Befehle identisch. Hier sind die Rohdaten:
So readxlist der klare Gewinner, wenn es um Geschwindigkeit geht. gdataEs ist besser, etwas anderes zu tun, da das Lesen von Excel-Dateien schmerzhaft langsam ist und dieses Problem nur bei größeren Tabellen noch verstärkt wird.
Zwei Draws von openxlsxsind 1) seine umfangreichen anderen Methoden ( readxlist darauf ausgelegt, nur eine Sache zu tun, was wahrscheinlich ein Teil dessen ist, warum es so schnell ist), insbesondere seine write.xlsxFunktion, und 2) (eher ein Nachteil für readxl) das col_typesArgument in readxlnur (as dieses Schreibens) akzeptiert einige nicht standardmäßige R: "text"anstelle von "character"und "date"anstelle von "Date".
Es wäre großartig, wenn Sie auch den Benchmark für XLConnect hinzufügen würden. Kommentieren Sie auch, dass readxl nicht schreiben kann. xlsx und openxlsx funktionieren mit der Option col_types oder colClasses nicht richtig.
Skan
@skan Ich habe anfangs einige Tests mit durchgeführt, XLConnectaber es ist sehr langsam; Ich glaube readxl, die Nachteile wurden in meinem letzten Absatz ausreichend behandelt. und ich habe keine ähnliche Erfahrung wie Sie mit xlsxoder, openxlsxda ich regelmäßig beide verwende, um Typen anzugeben.
In anderen SE-Netzen wäre diese Antwort geschlossen, da sie nur über eine Verbindung verfügt.
Luchonacho
13
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)
Eine andere Lösung ist das xlsReadWritePaket, für das keine zusätzlichen Installationen erforderlich sind. Sie müssen jedoch die zusätzliche shlib herunterladen, bevor Sie sie zum ersten Mal verwenden.
require(xlsReadWrite)
xls.getshlib()
Wenn Sie dies vergessen, kann dies zu völliger Frustration führen. War schon da und so ...
Nebenbemerkung: Möglicherweise möchten Sie in ein textbasiertes Format (z. B. CSV) konvertieren und von dort aus einlesen. Dies aus einer Reihe von Gründen:
Unabhängig von Ihrer Lösung (RODBC, gdata, xlsReadWrite) können bei der Konvertierung Ihrer Daten einige seltsame Dinge passieren. Besonders Daten können ziemlich umständlich sein. Das HFWutilsPaket enthält einige Tools für den Umgang mit EXCEL-Daten (gemäß dem Kommentar von @Ben Bolker).
Wenn Sie große Blätter haben, ist das Einlesen von Textdateien schneller als das Einlesen von EXCEL.
Für XLS- und XLSX-Dateien sind möglicherweise unterschiedliche Lösungen erforderlich. ZB unterstützt das xlsReadWrite-Paket derzeit keine .xlsx AFAIK. gdataerfordert die Installation zusätzlicher Perl-Bibliotheken für die XLSX-Unterstützung. xlsxDas Paket kann gleichnamige Erweiterungen verarbeiten.
@ Ben Danke für den Tipp, ich werde ihn in meine Antwort aufnehmen. Ich habe jedoch nicht versucht, vollständig zu sein, da die Wiki-Seite, auf die die akzeptierte Antwort verweist, bereits ziemlich vollständig ist. Das HFWutils-Paket wird jedoch nicht erwähnt.
Joris Meys
1
-1; Siehe meine Antwort. TL: DR: Excel speichert kein Dataset mit voller Genauigkeit in csv (oder in der Zwischenablage). Es bleiben nur die sichtbaren Werte erhalten.
Russellpierce
5
Wie oben in vielen anderen Antworten erwähnt, gibt es viele gute Pakete, die eine Verbindung zur XLS / X-Datei herstellen und die Daten auf vernünftige Weise abrufen. Sie sollten jedoch gewarnt werden, dass Sie unter keinen Umständen die Zwischenablage (oder eine CSV-Datei) zum Abrufen von Daten aus Excel verwenden sollten. Um zu sehen warum, geben Sie =1/3eine Zelle in Excel ein. Reduzieren Sie nun die Anzahl der für Sie sichtbaren Dezimalstellen auf zwei. Kopieren Sie dann die Daten und fügen Sie sie in R ein. Speichern Sie nun die CSV. Sie werden feststellen, dass Excel in beiden Fällen nur die Daten beibehalten hat, die für Sie über die Benutzeroberfläche sichtbar waren, und dass Sie die Genauigkeit Ihrer tatsächlichen Quelldaten verloren haben.
Ich würde gerne wissen, wer die numerische Wiedergabetreue für nicht relevant / wichtig hielt.
Russellpierce
1
Gute Warnung. Dies hängt jedoch vom verwendeten Paket ab. Einige fallen nicht in diese Falle.
RockScience
@RocketScience Dies ist eine grundlegende Entwurfsoption für den CSV-Export nach Excel. Haben Sie ein Beispiel für ein Paket, das die Zwischenablage verwendet, bei der dieses Problem nicht auftritt? Pakete, die die xls xlsx-Datei direkt analysieren, neigen dazu, nicht in diese Falle zu tappen. So der spezifische Umfang meiner Warnung.
Russellpierce
Unter Unix können Sie es versuchen gnumeric::read.gnumeric.sheet. Unter Windows bin ich mir nicht 100% sicher, aber ich denke, es gdata::read.xlssollte auch gut funktionieren (Perl muss allerdings installiert werden)
RockScience
@RockScience Respektvollerweise arbeitet gdata :: read.xls nicht mit Zwischenablagedaten (es sei denn, Sie geben sich alle Mühe) und gnumeric ist nicht Excel. Ohne außergewöhnliche Beweise bleibt meine Warnung bestehen. Es gibt so viele andere gute Optionen als Antwort auf diese Frage - hoffen wir, dass die Leute diese stattdessen verwenden.
Russellpierce
5
Wenn Sie die Antwort von @Mikko erweitern, können Sie einen ordentlichen Trick verwenden, um die Dinge zu beschleunigen, ohne Ihre Spaltenklassen im Voraus "kennen" zu müssen. Verwenden Sie einfach read.xlsx, um eine begrenzte Anzahl von Datensätzen abzurufen, um die Klassen zu bestimmen, und folgen Sie dann mitread.xlsx2
Beispiel
# 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)))
Ihre Lösung liefert numericfür factorsauf meinem Computer. read.xlsxverwendet characterin readColumnsFunktion, um Faktoren anzugeben. Ich bin sicher, dass es eine elegantere Möglichkeit gibt, Faktoren als Zeichen zu erhalten, aber hier ist eine modifizierte Version Ihrer Funktion, die funktioniert : df.real <- read.xlsx2("filename.xlsx", 1, colClasses=gsub("factor", "character", as.vector(sapply(df.temp, class)))).
Mikko
Dies funktioniert nur insoweit, als der Spaltentyp durch die erste Zeile angemessen bestimmt werden kann. Normalerweise analysiert man mehr als die erste Zeile, um diese Bestimmung vorzunehmen. Die Antwort könnte verbessert werden, um den Kommentar von aaa90210 zu adressieren, indem das Paket benannt wird, aus dem diese Funktionen stammen.
Russellpierce
1
Eine Excel-Datei kann wie folgt direkt in R eingelesen werden:
gdata
Version 2.8.2 liestxlsx
Dateien mit derread.xls
Funktionxlsx
Paket für xlsx / xlsm / xls, weiß nicht über xlam usw.Antworten:
Ja. Siehe die entsprechende Seite im R-Wiki . Kurze Antwort:
read.xls
Dasgdata
Paket funktioniert die meiste Zeit (obwohl Perl auf Ihrem System installiert sein muss - normalerweise bereits unter MacOS und Linux, aber unter Windows ein zusätzlicher Schritt, siehe http://strawberryperl.com/). ). Auf der R-Wiki-Seite sind verschiedene Vorbehalte und Alternativen aufgeführt.Der einzige Grund, warum ich dies nicht direkt sehe, ist, dass Sie die Tabelle möglicherweise untersuchen möchten, um festzustellen, ob sie Störungen aufweist (seltsame Überschriften, mehrere Arbeitsblätter [Sie können jeweils nur eine lesen, obwohl Sie offensichtlich alle durchlaufen können] , einschließlich Grundstücke usw.). Aber für eine wohlgeformte, rechteckige Tabelle mit einfachen Zahlen und Zeichendaten (dh nicht durch Kommas formatierten Zahlen, Datumsangaben, Formeln mit Fehlern beim Teilen durch Null, fehlenden Werten usw. usw.) habe ich im Allgemeinen kein Problem mit diesem Prozess.
quelle
na.strings="-"
dem Problem? Wie viele dieser Probleme sind generisch und wie viele (z. B. numerische Felder mit Kommas) können mit anderen Tools wie XLConnect ... behoben werden?read.xls
Erfolg in ein sehr großes Blatt aus einer Excel - Datei zu lesen , wo beideXLConnect
undxlsx
scheiterte (ich glaube , weil sie beide verlassen sich auf Apache POI )Lassen Sie mich noch einmal wiederholen, was @Chase empfohlen hat: Verwenden Sie XLConnect .
Die Gründe für die Verwendung von XLConnect sind meiner Meinung nach:
XLConnect ist im Vergleich zu anderen Lösungen etwas neu und wird daher in Blog-Posts und Referenzdokumenten seltener erwähnt. Für mich war es sehr nützlich.
quelle
Und jetzt gibt es readxl :
Verwendung
Beachten Sie, dass in der Beschreibung zwar "keine externen Abhängigkeiten" angegeben ist, jedoch das
Rcpp
Paket erforderlich ist , für das wiederum Rtools (für Windows) oder Xcode (für OSX) erforderlich sind , die Abhängigkeiten außerhalb von R sind. Viele Benutzer haben sie jedoch aus anderen Gründen installiert .quelle
read_excel
? Ich mag die Geschwindigkeit im Vergleich zuread.xlsx
, aber wenn man Spalten manuell von Zeichen in Faktoren konvertieren muss, ist der Zweck zunichte.EDIT 2015-Oktober: Wie andere hier kommentiert haben, sind die
openxlsx
undreadxl
-Pakete bei weitem schneller als dasxlsx
Paket und schaffen es tatsächlich, größere Excel-Dateien (> 1500 Zeilen &> 120 Spalten) zu öffnen. @MichaelChirico zeigt, dass diesreadxl
besser ist, wenn Geschwindigkeit bevorzugt wird, undopenxlsx
ersetzt die vomxlsx
Paket bereitgestellten Funktionen . Wenn Sie nach einem Paket zum Lesen, Schreiben und Ändern von Excel-Dateien im Jahr 2015 suchen, wählen Sie dasopenxlsx
anstelle vonxlsx
.Vor 2015: Ich habe
xlsx
Paket verwendet . Es hat meinen Workflow mit Excel und R geändert. Keine nervigen Popups mehr, die fragen, ob ich sicher bin, dass ich meine Excel-Tabelle im TXT-Format speichern möchte. Das Paket schreibt auch Excel-Dateien.Allerdings finde ich die
read.xlsx
Funktion beim Öffnen großer Excel-Dateien langsam.read.xlsx2
Die Funktion ist erheblich schneller, stellt jedoch die Vektorklasse der data.frame-Spalten nicht in Frage. Sie müssen dencolClasses
Befehl verwenden, um die gewünschten Spaltenklassen anzugeben, wenn Sie dieread.xlsx2
Funktion verwenden. Hier ist ein praktisches Beispiel:read.xlsx("filename.xlsx", 1)
Liest Ihre Datei und macht die Spaltenklassen data.frame nahezu nützlich, ist jedoch für große Datenmengen sehr langsam. Funktioniert auch für.xls
Dateien.read.xlsx2("filename.xlsx", 1)
ist schneller, aber Sie müssen Spaltenklassen manuell definieren. Eine Verknüpfung besteht darin, den Befehl zweimal auszuführen (siehe das folgende Beispiel).character
Die Spezifikation konvertiert Ihre Spalten in Faktoren. VerwendungDate
undPOSIXct
Optionen für die Zeit.quelle
Angesichts der
R
Vielzahl unterschiedlicher Möglichkeiten zum Einlesen einer Excel-Datei und der Vielzahl von Antworten hier dachte ich, ich würde versuchen, etwas Licht ins Dunkel zu bringen, welche der hier genannten Optionen (in einigen einfachen Situationen) die beste Leistung erbringt.Ich selbst habe es verwendet,
xlsx
seit ich angefangen habeR
, für Trägheit, wenn nichts anderes, und ich habe kürzlich bemerkt, dass es keine objektiven Informationen darüber zu geben scheint, welches Paket besser funktioniert.Jede Benchmarking-Übung ist mit Schwierigkeiten behaftet, da einige Pakete bestimmte Situationen mit Sicherheit besser bewältigen als andere und ein Wasserfall mit anderen Einschränkungen.
Trotzdem verwende ich einen (reproduzierbaren) Datensatz, der meiner Meinung nach in einem ziemlich gebräuchlichen Format vorliegt (8 Zeichenfolgenfelder, 3 numerische, 1 Ganzzahl, 3 Datumsangaben):
Ich schrieb dann diese zu csv und eröffnen in Libreoffice und speicherte es als XLSX - Datei, dann gebenchmarkt 4 der in diesem Thread erwähnten Pakete:
xlsx
,openxlsx
,readxl
, undgdata
, um die Standardoptionen (Ich habe auch versucht , eine Version von , ob ich Geben Sie die Spaltentypen an, dies hat jedoch die Rangfolge nicht geändert.Ich schließe aus,
RODBC
weil ich unter Linux bin.XLConnect
weil es den Anschein hat, dass sein Hauptzweck nicht darin besteht, einzelne Excel-Tabellen zu lesen, sondern ganze Excel-Arbeitsmappen zu importieren, scheint es unfair, sein Pferd nur mit seinen Lesefähigkeiten ins Rennen zu bringen; undxlsReadWrite
weil es nicht mehr mit meiner Version von kompatibel istR
(scheint auslaufen).Ich habe dann Benchmarks mit
NN=1000L
undNN=25000L
(Zurücksetzen des Startwerts vor jeder Deklaration derdata.frame
oben genannten) ausgeführt, um Unterschiede in Bezug auf die Größe der Excel-Datei zu berücksichtigen.gc
ist in erster Linie fürxlsx
, die ich manchmal gefunden habe, kann Speicher Clogs erstellen. Hier sind ohne weiteres die Ergebnisse, die ich gefunden habe:Excel-Datei mit 1.000 Zeilen
So
readxl
ist der Gewinner, mitopenxlsx
wettbewerbsfähigem undgdata
klarem Verlierer. Nehmen Sie jede Maßnahme relativ zum Spaltenminimum:Wir sehen meinen eigenen Favoriten,
xlsx
ist 60% langsamer alsreadxl
.Excel-Datei mit 25.000 Zeilen
Aufgrund des Zeitaufwands habe ich nur 20 Wiederholungen für die größere Datei durchgeführt, ansonsten waren die Befehle identisch. Hier sind die Rohdaten:
Hier sind die relativen Daten:
So
readxl
ist der klare Gewinner, wenn es um Geschwindigkeit geht.gdata
Es ist besser, etwas anderes zu tun, da das Lesen von Excel-Dateien schmerzhaft langsam ist und dieses Problem nur bei größeren Tabellen noch verstärkt wird.Zwei Draws von
openxlsx
sind 1) seine umfangreichen anderen Methoden (readxl
ist darauf ausgelegt, nur eine Sache zu tun, was wahrscheinlich ein Teil dessen ist, warum es so schnell ist), insbesondere seinewrite.xlsx
Funktion, und 2) (eher ein Nachteil fürreadxl
) dascol_types
Argument inreadxl
nur (as dieses Schreibens) akzeptiert einige nicht standardmäßigeR
:"text"
anstelle von"character"
und"date"
anstelle von"Date"
.quelle
XLConnect
aber es ist sehr langsam; Ich glaubereadxl
, die Nachteile wurden in meinem letzten Absatz ausreichend behandelt. und ich habe keine ähnliche Erfahrung wie Sie mitxlsx
oder,openxlsx
da ich regelmäßig beide verwende, um Typen anzugeben.Ich hatte viel Glück mit
XLConnect
: http://cran.r-project.org/web/packages/XLConnect/index.htmlquelle
Persönlich mag ich RODBC und kann es empfehlen.
quelle
Ich habe das Paket
openxlsx
heute ausprobiert. Es hat sehr gut (und schnell) funktioniert.http://cran.r-project.org/web/packages/openxlsx/index.html
quelle
Eine andere Lösung ist das
xlsReadWrite
Paket, für das keine zusätzlichen Installationen erforderlich sind. Sie müssen jedoch die zusätzliche shlib herunterladen, bevor Sie sie zum ersten Mal verwenden.Wenn Sie dies vergessen, kann dies zu völliger Frustration führen. War schon da und so ...
Nebenbemerkung: Möglicherweise möchten Sie in ein textbasiertes Format (z. B. CSV) konvertieren und von dort aus einlesen. Dies aus einer Reihe von Gründen:
Unabhängig von Ihrer Lösung (RODBC, gdata, xlsReadWrite) können bei der Konvertierung Ihrer Daten einige seltsame Dinge passieren. Besonders Daten können ziemlich umständlich sein. Das
HFWutils
Paket enthält einige Tools für den Umgang mit EXCEL-Daten (gemäß dem Kommentar von @Ben Bolker).Wenn Sie große Blätter haben, ist das Einlesen von Textdateien schneller als das Einlesen von EXCEL.
Für XLS- und XLSX-Dateien sind möglicherweise unterschiedliche Lösungen erforderlich. ZB unterstützt das xlsReadWrite-Paket derzeit keine .xlsx AFAIK.
gdata
erfordert die Installation zusätzlicher Perl-Bibliotheken für die XLSX-Unterstützung.xlsx
Das Paket kann gleichnamige Erweiterungen verarbeiten.quelle
Wie oben in vielen anderen Antworten erwähnt, gibt es viele gute Pakete, die eine Verbindung zur XLS / X-Datei herstellen und die Daten auf vernünftige Weise abrufen. Sie sollten jedoch gewarnt werden, dass Sie unter keinen Umständen die Zwischenablage (oder eine CSV-Datei) zum Abrufen von Daten aus Excel verwenden sollten. Um zu sehen warum, geben Sie
=1/3
eine Zelle in Excel ein. Reduzieren Sie nun die Anzahl der für Sie sichtbaren Dezimalstellen auf zwei. Kopieren Sie dann die Daten und fügen Sie sie in R ein. Speichern Sie nun die CSV. Sie werden feststellen, dass Excel in beiden Fällen nur die Daten beibehalten hat, die für Sie über die Benutzeroberfläche sichtbar waren, und dass Sie die Genauigkeit Ihrer tatsächlichen Quelldaten verloren haben.quelle
gnumeric::read.gnumeric.sheet
. Unter Windows bin ich mir nicht 100% sicher, aber ich denke, esgdata::read.xls
sollte auch gut funktionieren (Perl muss allerdings installiert werden)Wenn Sie die Antwort von @Mikko erweitern, können Sie einen ordentlichen Trick verwenden, um die Dinge zu beschleunigen, ohne Ihre Spaltenklassen im Voraus "kennen" zu müssen. Verwenden Sie einfach
read.xlsx
, um eine begrenzte Anzahl von Datensätzen abzurufen, um die Klassen zu bestimmen, und folgen Sie dann mitread.xlsx2
Beispiel
quelle
numeric
fürfactors
auf meinem Computer.read.xlsx
verwendetcharacter
inreadColumns
Funktion, um Faktoren anzugeben. Ich bin sicher, dass es eine elegantere Möglichkeit gibt, Faktoren als Zeichen zu erhalten, aber hier ist eine modifizierte Version Ihrer Funktion, die funktioniert :df.real <- read.xlsx2("filename.xlsx", 1, colClasses=gsub("factor", "character", as.vector(sapply(df.temp, class))))
.Eine Excel-Datei kann wie folgt direkt in R eingelesen werden:
Lesen von xls- und xlxs-Dateien mit dem readxl-Paket
quelle