Wie konvertiert man eine Datenrahmenspalte in einen numerischen Typ?
quelle
Wie konvertiert man eine Datenrahmenspalte in einen numerischen Typ?
Da (noch) niemand ein Häkchen bekommen hat, gehe ich davon aus, dass Sie ein praktisches Problem haben, hauptsächlich, weil Sie nicht angegeben haben, in welchen Vektortyp Sie konvertieren möchten numeric
. Ich schlage vor, dass Sie die transform
Funktion anwenden , um Ihre Aufgabe abzuschließen.
Jetzt werde ich eine bestimmte "Konvertierungsanomalie" demonstrieren:
# create dummy data.frame
d <- data.frame(char = letters[1:5],
fake_char = as.character(1:5),
fac = factor(1:5),
char_fac = factor(letters[1:5]),
num = 1:5, stringsAsFactors = FALSE)
Lassen Sie uns einen Blick darauf werfen data.frame
> d
char fake_char fac char_fac num
1 a 1 1 a 1
2 b 2 2 b 2
3 c 3 3 c 3
4 d 4 4 d 4
5 e 5 5 e 5
und lass uns rennen:
> sapply(d, mode)
char fake_char fac char_fac num
"character" "character" "numeric" "numeric" "numeric"
> sapply(d, class)
char fake_char fac char_fac num
"character" "character" "factor" "factor" "integer"
Jetzt fragen Sie sich wahrscheinlich: "Wo ist eine Anomalie?" Nun, ich bin in R auf ziemlich eigenartige Dinge gestoßen, und das ist nicht die verwirrendste Sache, aber es kann Sie verwirren, besonders wenn Sie dies lesen, bevor Sie sich ins Bett rollen.
Hier geht's: Die ersten beiden Spalten sind character
. Ich habe absichtlich 2 genannt nd ein fake_char
. Erkennen Sie die Ähnlichkeit dieser character
Variablen mit einer, die Dirk in seiner Antwort erstellt hat. Es ist eigentlich ein numerical
Vektor, in den konvertiert wurde character
. 3 rd und 4 th Spalte sind factor
, und die letzte ist „rein“ numeric
.
Wenn Sie die transform
Funktion verwenden, können Sie die fake_char
in numeric
, aber nicht die char
Variable selbst konvertieren .
> transform(d, char = as.numeric(char))
char fake_char fac char_fac num
1 NA 1 1 a 1
2 NA 2 2 b 2
3 NA 3 3 c 3
4 NA 4 4 d 4
5 NA 5 5 e 5
Warning message:
In eval(expr, envir, enclos) : NAs introduced by coercion
Aber wenn Sie dasselbe tun fake_char
und char_fac
, haben Sie Glück und kommen ohne NA davon:
> transform(d, fake_char = as.numeric(fake_char),
char_fac = as.numeric(char_fac))
char fake_char fac char_fac num
1 a 1 1 1 1
2 b 2 2 2 2
3 c 3 3 3 3
4 d 4 4 4 4
5 e 5 5 5 5
Wenn Sie transformiert speichern data.frame
und nach mode
und class
suchen, erhalten Sie:
> D <- transform(d, fake_char = as.numeric(fake_char),
char_fac = as.numeric(char_fac))
> sapply(D, mode)
char fake_char fac char_fac num
"character" "numeric" "numeric" "numeric" "numeric"
> sapply(D, class)
char fake_char fac char_fac num
"character" "numeric" "factor" "numeric" "integer"
Die Schlussfolgerung lautet also: Ja, Sie können einen character
Vektor in einen numeric
Eins konvertieren , aber nur, wenn seine Elemente in "konvertierbar" sind numeric
. Wenn der character
Vektor nur ein Element enthält, wird beim Versuch, diesen Vektor in numerical
einen zu konvertieren, eine Fehlermeldung angezeigt .
Und nur um meinen Standpunkt zu beweisen:
> err <- c(1, "b", 3, 4, "e")
> mode(err)
[1] "character"
> class(err)
[1] "character"
> char <- as.numeric(err)
Warning message:
NAs introduced by coercion
> char
[1] 1 NA 3 4 NA
Und jetzt versuchen Sie nur zum Spaß (oder zum Üben), die Ausgabe dieser Befehle zu erraten:
> fac <- as.factor(err)
> fac
???
> num <- as.numeric(fac)
> num
???
Herzliche Grüße an Patrick Burns! =)
Etwas, das mir geholfen hat: Wenn Sie Bereiche von Variablen konvertieren müssen (oder nur mehrere), können Sie diese verwenden
sapply
.Ein bisschen unsinnig, aber nur zum Beispiel:
Angenommen, die Spalten 3, 6-15 und 37 Ihres Datenrahmens müssen in einen numerischen konvertiert werden.
quelle
sapply
Anrufas.data.frame()
auf der rechten Seite einbinden, wie unten von @Mehrad Mahmoudian vorgeschlagen, funktioniert es.Wenn
x
der Spaltenname des Datenrahmensdat
und der Typfaktorx
ist, verwenden Sie:quelle
as.character
Tat das, wonach ich gesucht habe. Andernfalls geht die Konvertierung manchmal schief. Zumindest in meinem Fall.Error: (list) object cannot be coerced to type 'double'
obwohl ich mir ziemlich sicher war, dass mein Vektor keine Zeichen / Interpunktionen hatte. Dann habe ich es versuchtas.numeric(as.character(dat$x))
und es hat funktioniert. Jetzt bin ich mir nicht sicher, ob meine Spalte tatsächlich nur ganze Zahlen ist oder nicht!Ich hätte einen Kommentar hinzugefügt (kann nicht niedrige Bewertung)
Nur um User276042 und Pangratz hinzuzufügen
Dadurch werden die Werte der vorhandenen Spalte x überschrieben
quelle
Während Ihre Frage ausschließlich numerisch ist, gibt es viele Konvertierungen, die zu Beginn von R schwer zu verstehen sind. Ich werde mich mit Methoden befassen, um zu helfen. Diese Frage ähnelt dieser Frage .
Die Typkonvertierung kann ein Problem in R sein, da (1) Faktoren nicht direkt in numerische konvertiert werden können, sondern zuerst in die Zeichenklasse konvertiert werden müssen, (2) Daten ein Sonderfall sind, den Sie normalerweise separat behandeln müssen, und (3) Das Schleifen über Datenrahmenspalten kann schwierig sein. Glücklicherweise hat die "Tidyverse" die meisten Probleme gelöst.
Diese Lösung verwendet
mutate_each()
, um eine Funktion auf alle Spalten in einem Datenrahmen anzuwenden. In diesem Fall möchten wir dietype.convert()
Funktion anwenden , die Zeichenfolgen in numerische konvertiert, wo dies möglich ist. Weil R Faktoren liebt (nicht sicher warum), werden Zeichenspalten, die Zeichen bleiben sollen, in Faktor geändert. Um dies zu beheben, wird diemutate_if()
Funktion verwendet, um Spalten zu erkennen, die Faktoren sind, und um das Zeichen zu ändern. Zuletzt wollte ich zeigen, wie Lubridate verwendet werden kann, um einen Zeitstempel in der Zeichenklasse auf Datum und Uhrzeit zu ändern, da dies auch für Anfänger häufig ein Haftblock ist.quelle
mutate_all(type.convert, as.is=TRUE)
anstelle von verwenden . ist ein Argument , das angibt, ob Zeichenfolgen als Zeichen oder als Faktoren konvertiert werden sollen. Standardmäßig konvertiert in (dh konvertiert Zeichenfolgen in Faktorklasse anstelle von Zeichenklasse).mutate_all(type.convert)
mutate_if(is.factor, as.character)
as.is
type.convert()
as.is=FALSE
type.convert()
Tim hat recht und Shane hat eine Auslassung. Hier sind weitere Beispiele:
Wir haben
data.frame
jetzt eine Zusammenfassung der Faktorspalte (Anzahl) und numerische Zusammenfassungen desas.numeric()
--- was falsch ist, da es die numerischen Faktorstufen hat --- und die (korrekte) Zusammenfassung desas.numeric(as.character())
.quelle
Mit dem folgenden Code können Sie alle Datenrahmenspalten in numerische konvertieren (X ist der Datenrahmen, in den die Spalten konvertiert werden sollen):
und um die gesamte Matrix in eine numerische umzuwandeln, haben Sie zwei Möglichkeiten: Entweder:
oder:
Alternativ können Sie die
data.matrix
Funktion verwenden, um alles in Zahlen umzuwandeln. Beachten Sie jedoch, dass die Faktoren möglicherweise nicht korrekt konvertiert werden. Daher ist es sicherer, allescharacter
zuerst in Folgendes zu konvertieren :Normalerweise verwende ich diesen letzten, wenn ich gleichzeitig in Matrix und Numerisch konvertieren möchte
quelle
Wenn Sie auf Probleme stoßen mit:
Schauen Sie sich Ihre Dezimalstellen an. Wenn sie "," statt "sind." (zB "5,3") das oben genannte funktioniert nicht.
Eine mögliche Lösung ist:
Ich glaube, dass dies in einigen nicht englischsprachigen Ländern durchaus üblich ist.
quelle
Universeller Weg mit
type.convert()
undrapply()
:quelle
as.is = TRUE
Sie einfach, wenn Sie Ihren Charakter entweder in numerische oder in Faktoren umwandeln möchtenmatrix
durch numerische Änderungenclasses=matrix
fehlerhaft ist. Das erste Argument muss vom Modus-Zeichen seinUm eine Datenrahmenspalte in eine numerische zu konvertieren, müssen Sie nur Folgendes tun: -
Faktor zu numerisch: -
quelle
sapply(data_frame,function(x) as.numeric(as.character(x)))
Obwohl andere das Thema ziemlich gut behandelt haben, möchte ich diesen zusätzlichen kurzen Gedanken / Hinweis hinzufügen. Mit regexp können Sie im Voraus prüfen, ob Zeichen möglicherweise nur aus Zahlen bestehen.
Auf dieser wirklich schönen Website finden Sie anspruchsvollere reguläre Ausdrücke und einen guten Grund, warum Sie ihre Kraft lernen / erleben können: http://regexr.com/
quelle
In Anbetracht der Tatsache, dass möglicherweise Char-Spalten vorhanden sind, basiert dies auf @Abdou in Get- Spaltentypen von Excel- Tabellen. Antwort automatisch :
quelle
In meinem PC (R v.3.2.3)
apply
odersapply
geben Sie einen Fehler.lapply
funktioniert gut.quelle
Wenn der Datenrahmen mehrere Spaltentypen enthält, einige Zeichen, einige numerische, versuchen Sie Folgendes, um nur die Spalten, die numerische Werte enthalten, in numerische zu konvertieren:
quelle
mit hablar :: convert
Um mehrere Spalten einfach in verschiedene Datentypen zu konvertieren, können Sie sie verwenden
hablar::convert
. Einfache Syntax:df %>% convert(num(a))
Konvertiert die Spalte a von df in numerisch.Detailliertes Beispiel
Konvertieren Sie alle Spalten von
mtcars
in Zeichen.Mit
hablar::convert
:Ergebnisse in:
quelle
Um ein Zeichen in ein numerisches Zeichen umzuwandeln, müssen Sie es durch Anwenden in einen Faktor umwandeln
Sie müssen zwei Spalten mit denselben Daten erstellen, da eine Spalte nicht in numerische konvertiert werden kann. Wenn Sie eine Konvertierung durchführen, wird der folgende Fehler angezeigt
Nachdem Sie dies getan haben, gelten zwei Spalten mit denselben Daten
Das Zeichen wird erfolgreich in numerisch umgewandelt
quelle
df
ist Ihr Datenrahmen.x
ist eine Spalte, diedf
Sie konvertieren möchtenquelle
Wenn Sie die Faktoren nicht beibehalten möchten und sie auf eine Spalte anwenden möchten, die in eine numerische konvertiert werden kann, habe ich das folgende Skript verwendet. Wenn df Ihr ursprünglicher Datenrahmen ist, können Sie das folgende Skript verwenden.
Ich bezog mich übrigens auf die Lösung von Shane und Joran
quelle