Ich habe eine CSV-Datei, in der einige der numerischen Werte als Zeichenfolgen mit Kommas als Tausendertrennzeichen ausgedrückt werden, z . B. "1,513"
anstelle von 1513
. Was ist der einfachste Weg, um die Daten in R einzulesen?
Ich kann verwenden read.csv(..., colClasses="character")
, aber dann muss ich die Kommas aus den relevanten Elementen entfernen, bevor ich diese Spalten in numerische konvertiere, und ich kann keinen geeigneten Weg finden, dies zu tun.
setAs("character", "logical.Y.N", function(from) c(Y=TRUE,N=FALSE)[from] )
).setClass("num.with.commas")
oder verwendensuppresMessage(setAs(.....))
, um eine Nachricht über fehlende Klasse zu vermeiden.Ich möchte R verwenden, anstatt die Daten vorzuverarbeiten, da dies die Überarbeitung der Daten erleichtert. Dem Vorschlag von Shane folgend
gsub
, denke ich, dass dies so ordentlich ist, wie ich kann:quelle
Diese Frage ist mehrere Jahre alt, aber ich bin darauf gestoßen, was bedeutet, dass andere es vielleicht tun werden.
Die
readr
Bibliothek / das Paket hat einige nette Funktionen. Eine davon ist eine gute Möglichkeit, solche "chaotischen" Spalten zu interpretieren.Dies ergibt
Quelle: lokaler Datenrahmen [4 x 1]
Ein wichtiger Punkt beim Einlesen von Dateien: Sie müssen entweder vorverarbeiten, wie im obigen Kommentar zu
sed
, oder Sie müssen beim Lesen verarbeiten . Wenn Sie versuchen, Dinge nachträglich zu reparieren, werden häufig einige gefährliche Annahmen getroffen, die schwer zu finden sind. (Deshalb sind Flat Files überhaupt so böse.)Wenn ich zum Beispiel das nicht markiert
col_types
hätte, hätte ich folgendes bekommen:(Beachten Sie, dass es jetzt ein
chr
(character
) anstelle von a istnumeric
.)Oder gefährlicher, wenn es lang genug wäre und die meisten frühen Elemente keine Kommas enthielten:
(so dass die letzten paar Elemente aussehen :)
Dann werden Sie Probleme haben, dieses Komma überhaupt zu lesen!
quelle
eine
dplyr
Lösung mitmutate_all
und RohrenAngenommen, Sie haben Folgendes:
und möchten Kommas aus den Jahresvariablen X2014-X2016 entfernen und in numerische konvertieren. Angenommen, X2014-X2016 werden als Faktoren eingelesen (Standard).
mutate_all
wendet die Funktion (en) innerhalbfuns
auf die angegebenen Spalten anIch habe es nacheinander einzeln ausgeführt (wenn Sie mehrere Funktionen verwenden
funs
, erstellen Sie zusätzliche, unnötige Spalten).quelle
mutate_each
ist veraltet. Möchten Sie Ihre Antwort mitmutate_at
oder ähnlich aktualisieren ?"Vorverarbeitung" in R:
Kann
readLines
auf einem verwendentextConnection
. Entfernen Sie dann nur die Kommas zwischen den Ziffern:Es ist auch nützlich zu wissen, aber nicht direkt relevant für diese Frage, dass Kommas als Dezimaltrennzeichen von read.csv2 (automatisch) oder read.table (mit Einstellung des 'dec'-Parameters) behandelt werden können.
Bearbeiten: Später entdeckte ich, wie man colClasses verwendet, indem ich eine neue Klasse entwarf. Sehen:
Wie lade ich df mit 1000 Trennzeichen in R als numerische Klasse?
quelle
Wenn die Nummer durch "." Getrennt ist. und Dezimalstellen von "," (1.200.000,00) beim Anrufen
gsub
müssen Sieset fixed=TRUE as.numeric(gsub(".","",y,fixed=TRUE))
quelle
Ein sehr bequemer Weg ist
readr::read_delim
-familie. Nehmen Sie das Beispiel von hier: Wenn Sie CSV mit mehreren Trennzeichen in R importieren, können Sie dies wie folgt tun:Welches Ergebnis im erwarteten Ergebnis:
quelle
Mit der Funktion read_delim, die Teil der readr- Bibliothek ist, können Sie zusätzliche Parameter angeben:
* Semikolon in der zweiten Zeile bedeutet, dass read_delim durch CSV-Semikolon getrennte Werte liest.
Dies hilft, alle Zahlen mit einem Komma als richtige Zahlen zu lesen.
Grüße
Mateusz Kania
quelle
Wir können auch verwenden
readr::parse_number
, die Spalten müssen jedoch Zeichen sein. Wenn wir es für mehrere Spalten anwenden möchten, können wir Spalten mit durchlaufenlapply
Oder verwenden Sie
mutate_at
fromdplyr
, um es auf bestimmte Variablen anzuwenden.Daten
quelle
Ich denke, Vorverarbeitung ist der richtige Weg. Sie können Notepad ++ verwenden, das eine Ersetzungsoption für reguläre Ausdrücke enthält.
Zum Beispiel, wenn Ihre Datei so wäre:
Dann können Sie den regulären Ausdruck verwenden
"([0-9]+),([0-9]+)"
und durch ersetzen\1\2
Dann könnten Sie
x <- read.csv(file="x.csv",header=FALSE)
die Datei lesen.quelle