factor - Best Practice

Wie rufe ich R-Funktionen auf, wie selektiere ich Daten, ich weiß nicht genau ....

Moderatoren: EDi, jogo

Antworten
R007

factor - Best Practice

Beitrag von R007 »

Hallo,

was mich als R-Anfänger sehr häufig stört ist der Datentyp factor. Wenn ich beispielsweise Daten per DB-Connection (z.B. MySQL) einbinde, werden sowohl numerische Werte, also auch chars als factor dargestellt. Beim Import von CSV-Dateien gibt es ja die Option "StringAsFactor", welche es bei der DB-Verbindung nicht gibt, und ja auch nicht immer hilft.

Gerade Berechnungen auf factoren sind ja sehr "unschön".

Mich würde interessieren, wie ihr mit dem Datentyp factor umgeht? Konvertiert ihr immer alle factoren in den entsprechenden Datentyp und wenn ja wie? An der Stelle muss man ja aufpassen keine Daten falsch zu konvertieren.

Wir sind eure Best Practice in Bezug auf factoren?

Ich bin auf eure Antworten gespannt.

Gruß
R007
consuli
Beiträge: 479
Registriert: Mo Okt 10, 2016 8:18 pm

Re: factor - Best Practice

Beitrag von consuli »

Es gibt unterschiedliche Verfahrensweisen.

Variante 1
Factors über den Typ Cast as.character() in Buchstaben umwandeln. (Speicher fressend)

Variante 2
Factors möglichst als Factors belassen und nur bei Bearbeitung in character umwandeln und sofort danach mit dem Typ Cast as.factor() wieder zurück. (CPU-Zeit fressend)

Was vorteilhafter ist, hängt immer von der individuellen Daten- und Hardwaresituation ab.
Irmgard.
R007

Re: factor - Best Practice

Beitrag von R007 »

Interessant zu wissen.

Ich habe eben gelesen, dass Variante 1 beim konvertieren zu decimal (inkl. Nachkomma) ähnlich funktioniert, wobei erst nach character gecastet wird und anschließend nach decimal:
as.decimal(as.character(factor(Variable)))

Belasst ihr denn meistens factoren die character repräsentieren als factor? Hat das irgendwelche Vor- oder Nachteile?

Und wie handhabt ihr das bei numerischen Werten, auf welchen ihr Berechnungen durchführt? Machen diese als factor ggf. Probleme?
Benutzeravatar
EDi
Beiträge: 1599
Registriert: Sa Okt 08, 2016 3:39 pm

Re: factor - Best Practice

Beitrag von EDi »

Also RPostgreSQL und RSQLite konvertieren nicht nach factor und selbst wenn, dann könnte man stringsAsFactors an dbGetQuery() übergeben:

Code: Alles auswählen

library(DBI)
library(RSQLite)
con <- dbConnect(RSQLite::SQLite(), ":memory:")
str(iris)
dbWriteTable(con, "iris", iris)
str(dbGetQuery(con, "SELECT * FROM iris"))
Wie das bei MySQL ist weiß ich nicht.

Belasst ihr denn meistens factoren die character repräsentieren als factor? Hat das irgendwelche Vor- oder Nachteile?

Und wie handhabt ihr das bei numerischen Werten, auf welchen ihr Berechnungen durchführt? Machen diese als factor ggf. Probleme?
Ich vermeide factors solange ich sie nicht brauche (und das ist nur beim Model bilden), ansonsten ist alles als character.
Numerische Variable sind NIE Faktoren (außer ich will das), andersfalls deutet das auch ein Problem beim einlesen hin...
stringsAsFactors ist mit das schlimmste default in R (davon abgesehen, dass es ein langes CamelCase ist)...
Bitte immer ein reproduzierbares Minimalbeispiel angeben. Meinungen gehören mir und geben nicht die meines Brötchengebers wieder.

Dieser Beitrag ist lizensiert unter einer CC BY 4.0 Lizenz
Bild.
R007

Re: factor - Best Practice

Beitrag von R007 »

Gut zu wissen, dass ich nicht der einzige bin, der factoren nicht umbedingt nutzen möchte. :)

U.a. nutze ich das Paket RODBC, damit habe ich die Tage Daten eingelesen und aus float-Werten wurden factoren mit dem Inhalt von z.B. 12,34. Heißt hier müsste ich einfach StringAsFactor=F setzen und das betrifft dann auch float-Werte und nicht nur Strings?

Nachtrag: Habe gerade festgestellt, dass dann aus Float-Werten auch char-Werte werden. Was nicht so schlimm ist, da dadurch ja keine Nachkommastellen verloren gehen. Aber rechnen kann man mit diesen Werten dann auch nicht. Wie handhabt ihr Nachkommawerte?
Benutzeravatar
EDi
Beiträge: 1599
Registriert: Sa Okt 08, 2016 3:39 pm

Re: factor - Best Practice

Beitrag von EDi »

12,34
R ist english und da ist der Dezimaltrenner ein '.'.
Und das macht hier probleme.
Wie sind denn die Daten in deiner DB hinterlegt?
Paket RODBC
Das gibt es ein Argument 'dec=' z.B. in RODBC::sqlFetch() dass hie rnützlich werden könnte.
Wie gesagt, numerische Variablen sind IMMER numerisch. Wen dem nicht der Fall ist, das ist da eine Problem. Und anstatt die Symptome zu kurieren (as.character(as.numeric(x))), sollte man der Ursache auf den Grund gehen.
Bitte immer ein reproduzierbares Minimalbeispiel angeben. Meinungen gehören mir und geben nicht die meines Brötchengebers wieder.

Dieser Beitrag ist lizensiert unter einer CC BY 4.0 Lizenz
Bild.
R007

Re: factor - Best Practice

Beitrag von R007 »

R ist english und da ist der Dezimaltrenner ein '.'.
Und das macht hier probleme.
Wie sind denn die Daten in deiner DB hinterlegt?
In meiner DB sind die Werte mit Komma hinterlegt. Ah okay und R konvertiert beim Lesen der Daten aus der Tabelle als character, weil für ein aufgrund des Trennzeichen "," kein numerischer Wert ist.
Das gibt es ein Argument 'dec=' z.B. in RODBC::sqlFetch() dass hie rnützlich werden könnte.
Wie gesagt, numerische Variablen sind IMMER numerisch. Wen dem nicht der Fall ist, das ist da eine Problem. Und anstatt die Symptome zu kurieren (as.character(as.numeric(x))), sollte man der Ursache auf den Grund gehen.
Die Lösung wäre dann options(dec=".") oder muss hier das in der DB hinterlegte Trennzeichen hinterlegt werden?

Kann es leider gerade nicht prüfen...
Benutzeravatar
EDi
Beiträge: 1599
Registriert: Sa Okt 08, 2016 3:39 pm

Re: factor - Best Practice

Beitrag von EDi »

In meiner DB sind die Werte mit Komma hinterlegt. Ah okay und R konvertiert beim Lesen der Daten aus der Tabelle als character, weil für ein aufgrund des Trennzeichen "," kein numerischer Wert ist.
Genau!
Die Lösung wäre dann options(dec=".") oder muss hier das in der DB hinterlegte Trennzeichen hinterlegt werden?
Eine Mischugn aus beiden (kenne aich aber mit RMySQl nicht aus):
Das dec=';' muss in die Funktion für deinen Datenabruf.
Bitte immer ein reproduzierbares Minimalbeispiel angeben. Meinungen gehören mir und geben nicht die meines Brötchengebers wieder.

Dieser Beitrag ist lizensiert unter einer CC BY 4.0 Lizenz
Bild.
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: factor - Best Practice

Beitrag von jogo »

Manchmal sind factors recht hinterhältig. Wer hat noch nicht as.numeric() auf einen factor angewendet und sich über das Ergebnis gewundert?

Manchmal sind factors aber auch richtig genial. Wenn bei einer Modell-Formel y ~ a + b + c (z.B. bei lm()) in der rechten Seite Faktoren enthalten sind, wird auch das passende statistische Verfahren angewendet. In den Lehrbüchern oftmals getrennt dargestellt, lassen sich diese Verfahren doch einheitlich behandeln.

Gruß, Jörg
Antworten