Spalte mit Typ char/factor als numeric konvertieren

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

Moderatoren: EDi, jogo

Antworten
Effigy
Beiträge: 35
Registriert: Di Nov 26, 2019 11:44 am

Spalte mit Typ char/factor als numeric konvertieren

Beitrag von Effigy »

Hallo zusammen,

Ich habe einen dataframe, mit folgender Struktur:

Code: Alles auswählen

'data.frame':	42192 obs. of  13 variables:
 $ Datum     : Factor w/ 293 levels "01.01.2019","01.02.2019",..: 1 1 1 1 1 1 1 1 1 1 ...
 $ Uhrzeit   : Factor w/ 144 levels "00:10","00:20",..: 1 2 3 4 5 6 7 8 9 10 ...
 $ LT.2m     : Factor w/ 441 levels "-0,1","-0,2",..: 418 419 418 418 419 419 419 420 420 420 ...
 $ rel..LF.2m: Factor w/ 780 levels "20","20,1","20,2",..: 731 729 731 735 725 725 730 716 711 712 ...
 $ LT.20cm   : Factor w/ 452 levels "-0,1","-0,2",..: 425 425 425 425 425 425 425 425 426 426 ...
 $ BT.5cm    : Factor w/ 371 levels "-0,1","-0,2",..: 328 328 328 329 329 329 329 329 329 329 ...
 $ BT.20cm   : Factor w/ 300 levels "0,1","0,2","0,3",..: 252 252 252 252 253 253 253 253 253 253 ...
 $ BT.50cm   : Factor w/ 235 levels "1,4","1,5","1,6",..: 188 188 188 188 188 189 189 189 189 189 ...
 $ WG.2.5m   : Factor w/ 127 levels "0","0,1","0,2",..: 68 74 73 81 72 69 72 71 68 74 ...
 $ WR.2.5m   : Factor w/ 3595 levels "0","0,1","0,2",..: 1716 1707 1695 1744 1711 1559 1629 1636 1641 1608 ...
 $ G.Str..2m : Factor w/ 981 levels "0","1","10","100",..: 1 1 1 1 1 1 1 1 1 1 ...
 $ L.Druck   : Factor w/ 619 levels "1000","1000,1",..: 186 185 184 182 180 178 177 176 175 173 ...
 $ Nied.1m   : Factor w/ 43 levels "0","0,1","0,2",..: 1 1 1 1 1 1 1 1 1 1 ...
Nun möchte ich die letzte Zeile als numeric convertieren. Ich habe es auf zwei Arten probiert und es hat beidesmal nicht geklappt.

Code: Alles auswählen

WSDede46 <- read.csv2("P:/SWB/SWB_Alle/Data_Sölle/Wetter - Weather/Davis_Wetterstationen/WSDede46.csv", header = T, skip = 3, stringsAsFactors = F)
WSDede46$Nied.1m <- as.numeric(as.character( WSDede46$Nied.1m))
Hierbei kommt der Fehler:

> WSDede46$Nied.1m <- as.numeric(as.character( WSDede46$Nied.1m))
Warning message:
NAs introduced by coercion

Und bei

Code: Alles auswählen

WSDede46 <- read.csv2("P:/SWB/SWB_Alle/Data_Sölle/Wetter - Weather/Davis_Wetterstationen/WSDede46.csv", header = T, skip = 3)
WSDede46$Nied.1m <- as.numeric(WSDede46$Nied.1m)
sieht die Struktur so aus

Code: Alles auswählen

data.frame':	42192 obs. of  13 variables:
 $ Datum     : Factor w/ 293 levels "01.01.2019","01.02.2019",..: 1 1 1 1 1 1 1 1 1 1 ...
 $ Uhrzeit   : Factor w/ 144 levels "00:10","00:20",..: 1 2 3 4 5 6 7 8 9 10 ...
 $ LT.2m     : Factor w/ 441 levels "-0,1","-0,2",..: 418 419 418 418 419 419 419 420 420 420 ...
 $ rel..LF.2m: Factor w/ 780 levels "20","20,1","20,2",..: 731 729 731 735 725 725 730 716 711 712 ...
 $ LT.20cm   : Factor w/ 452 levels "-0,1","-0,2",..: 425 425 425 425 425 425 425 425 426 426 ...
 $ BT.5cm    : Factor w/ 371 levels "-0,1","-0,2",..: 328 328 328 329 329 329 329 329 329 329 ...
 $ BT.20cm   : Factor w/ 300 levels "0,1","0,2","0,3",..: 252 252 252 252 253 253 253 253 253 253 ...
 $ BT.50cm   : Factor w/ 235 levels "1,4","1,5","1,6",..: 188 188 188 188 188 189 189 189 189 189 ...
 $ WG.2.5m   : Factor w/ 127 levels "0","0,1","0,2",..: 68 74 73 81 72 69 72 71 68 74 ...
 $ WR.2.5m   : Factor w/ 3595 levels "0","0,1","0,2",..: 1716 1707 1695 1744 1711 1559 1629 1636 1641 1608 ...
 $ G.Str..2m : Factor w/ 981 levels "0","1","10","100",..: 1 1 1 1 1 1 1 1 1 1 ...
 $ L.Druck   : Factor w/ 619 levels "1000","1000,1",..: 186 185 184 182 180 178 177 176 175 173 ...
 $ Nied.1m   : num  1 1 1 1 1 1 1 1 1 1 ...
Alle Nullen wurden in Einsen umgewandelt und alle nicht-Nullen in Zweien wie es scheint. Was ist die Lösung?
Vielen Dank und frohe Feiertage!

Max
bigben
Beiträge: 2781
Registriert: Mi Okt 12, 2016 9:09 am

Re: Spalte mit Typ char/factor als numeric konvertieren

Beitrag von bigben »

Effigy hat geschrieben: Di Dez 17, 2019 4:15 pm Ich habe einen dataframe, mit folgender Struktur:

Code: Alles auswählen

'data.frame':	42192 obs. of  13 variables:
...
 $ LT.2m     : Factor w/ 441 levels "-0,1","-0,2",..: 418 419 418 418 419 419 419 420 420 420 ...
 $ rel..LF.2m: Factor w/ 780 levels "20","20,1","20,2",..: 731 729 731 735 725 725 730 716 711 712 ...
 $ LT.20cm   : Factor w/ 452 levels "-0,1","-0,2",..: 425 425 425 425 425 425 425 425 426 426 ...
...
Offensichtlich werden die mit Komma als Dezimaltrenner geschriebenen Zahlen als Text erkannt, obwohl read.csv2 ja eigentlich das Komma als Dezimaltrenner versteht. Wahrscheinlich steht da in irgendeiner Zeile noch was anderes, was R nicht als Zahl erkennt.

Mach doch mal

Code: Alles auswählen

WSDede46 <- read.csv2("P:/SWB/SWB_Alle/Data_Sölle/Wetter - Weather/Davis_Wetterstationen/WSDede46.csv", header = True, skip = 3, stringsAsFactors = F)
print(levels(WSDede46$Nied.1m))
Das sollte alle 43 Faktorlevel von Nied.1m ausgeben und die musst Du durchsehen, ob einer davon nicht als Zahl mit Komma zu lesen ist.

LG,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
jogo
Beiträge: 2086
Registriert: Fr Okt 07, 2016 8:25 am

Re: Spalte mit Typ char/factor als numeric konvertieren

Beitrag von jogo »

Hallo Max,

denke auch daran, dass sich die vorparametrisierten Versionen von read.table() nicht mehr in allen Parametern steuern lassen. Im Zweifelsfall sollte man das Original verwenden. Weiterhin solltest Du schon beim Einlesen versuchen, möglichst viel zum gewünschten Ergebnis hin zu konvertieren. Bei Dir gibt es anscheinend Zahlen mit Dezimalkomma - Du solltest dec="," versuchen.
Wenn diese Varianten in den Parametern nicht helfen, geht es an die Suche nach den Ursachen. (siehe Nachricht von Bernhard)
Anschließend muss man die störenden Zeichenketten überarbeiten ...

Gruß, Jörg
Effigy
Beiträge: 35
Registriert: Di Nov 26, 2019 11:44 am

Re: Spalte mit Typ char/factor als numeric konvertieren

Beitrag von Effigy »

bigben hat geschrieben: Di Dez 17, 2019 4:26 pm
Effigy hat geschrieben: Di Dez 17, 2019 4:15 pm Ich habe einen dataframe, mit folgender Struktur:

Code: Alles auswählen

'data.frame':	42192 obs. of  13 variables:
...
 $ LT.2m     : Factor w/ 441 levels "-0,1","-0,2",..: 418 419 418 418 419 419 419 420 420 420 ...
 $ rel..LF.2m: Factor w/ 780 levels "20","20,1","20,2",..: 731 729 731 735 725 725 730 716 711 712 ...
 $ LT.20cm   : Factor w/ 452 levels "-0,1","-0,2",..: 425 425 425 425 425 425 425 425 426 426 ...
...
Offensichtlich werden die mit Komma als Dezimaltrenner geschriebenen Zahlen als Text erkannt, obwohl read.csv2 ja eigentlich das Komma als Dezimaltrenner versteht. Wahrscheinlich steht da in irgendeiner Zeile noch was anderes, was R nicht als Zahl erkennt.

Mach doch mal

Code: Alles auswählen

WSDede46 <- read.csv2("P:/SWB/SWB_Alle/Data_Sölle/Wetter - Weather/Davis_Wetterstationen/WSDede46.csv", header = True, skip = 3, stringsAsFactors = F)
print(levels(WSDede46$Nied.1m))
Das sollte alle 43 Faktorlevel von Nied.1m ausgeben und die musst Du durchsehen, ob einer davon nicht als Zahl mit Komma zu lesen ist.

LG,
Bernhard
Hallo Bernhard,

wenn ich das mache sagt er mir NULL

Code: Alles auswählen

WSDede46 <- read.csv2("P:/SWB/SWB_Alle/Data_Sölle/Wetter - Weather/Davis_Wetterstationen/WSDede46.csv", header = T, skip = 3, stringsAsFactors = F)
> print(levels(WSDede46$Nied.1m))
NULL 
Wo liegt der Fehler?
LG
Max
jogo
Beiträge: 2086
Registriert: Fr Okt 07, 2016 8:25 am

Re: Spalte mit Typ char/factor als numeric konvertieren

Beitrag von jogo »

Hallo Max,

bei

Code: Alles auswählen

read.csv(..., , stringsAsFactors = F)
werden keine Faktoren angelegt - die Spalten bleiben einfach character.
Die Funktion levels() liefert nur für Faktoren ordentliche Ergebnisse.

Code: Alles auswählen

levels(c("10,3", "11.4"))
Etwas mehr Schmalz für Dein Problem:

Code: Alles auswählen

x <- c("10,3", "11.4")
y <- as.numeric(x)
x[is.na(y)] # zeigt die Zeichenketten aus x, die nicht in eine Zahl umgewandelt werden können.
Gruß, Jörg
bigben
Beiträge: 2781
Registriert: Mi Okt 12, 2016 9:09 am

Re: Spalte mit Typ char/factor als numeric konvertieren

Beitrag von bigben »

Sorry, ich hatte die Zeile zum Daten lesen einfach kopiert und dabei das stringsAsFactors übersehen. In dem Fall interessiert nicht
levels(WSDede46$Nied.1m) sondern unique(WSDede46$Nied.1m) .
Es muss weiter die eine von 43 Schreibweisen gefunden werden, die verhindert, dass das als Zahl gelesen wird.

LG,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
Effigy
Beiträge: 35
Registriert: Di Nov 26, 2019 11:44 am

Re: Spalte mit Typ char/factor als numeric konvertieren

Beitrag von Effigy »

Hallo Jörg,

ah okay, ich hab halt einfach den Code von Bernhard übernommen. Wenn ich es so wie du gesagt hast mache, kommt folgendes

Code: Alles auswählen

("0", "0,1", "0,2", "0,3", "0,4", "0,5", "0,6", "0,7", "0,8", 
"0,9", "1", "1,1", "1,2", "1,3", "1,4", "1,5", "1,7", "1,8", 
"1,9", "11", "15,9", "2", "2,2", "2,3", "2,4", "2,5", "2,7", 
"3,2", "3,3", "3,4", "3,5", "3,6", "3,7", "4,1", "4,2", "4,5", 
"5", "5,1", "5,4", "5,9", "9,3", "9,5", "NoValue")
Das Problem scheint wahrscheinlich der ""NoValue"" Eintrag zu sein.
Effigy
Beiträge: 35
Registriert: Di Nov 26, 2019 11:44 am

Re: Spalte mit Typ char/factor als numeric konvertieren

Beitrag von Effigy »

bigben hat geschrieben: Do Jan 09, 2020 12:20 pm Sorry, ich hatte die Zeile zum Daten lesen einfach kopiert und dabei das stringsAsFactors übersehen. In dem Fall interessiert nicht
levels(WSDede46$Nied.1m) sondern unique(WSDede46$Nied.1m) .
Es muss weiter die eine von 43 Schreibweisen gefunden werden, die verhindert, dass das als Zahl gelesen wird.

LG,
Bernhard
Halb so wild :) Trotzdem vielen Dank an dich und Jörg für eure schnelle und kompetente Hilfe! :)
jogo
Beiträge: 2086
Registriert: Fr Okt 07, 2016 8:25 am

Re: Spalte mit Typ char/factor als numeric konvertieren

Beitrag von jogo »

Hallo Max,

"NoValue" ist eine Umschreibung für NA. Wenn dies das einzige Problem ist, dann bitte den Parameter na.string= setzen.

Code: Alles auswählen

WSDede46 <- read.csv2("P:/SWB/SWB_Alle/Data_Sölle/Wetter - Weather/Davis_Wetterstationen/WSDede46.csv", 
header = TRUE, skip = 3, stringsAsFactors = FALSE, na.strings = "NoValue")
str(WSDede46)
Beispiel:

Code: Alles auswählen

x <- c("0", "0,1", "0,2", "0,3", "0,4", "0,5", "0,6", "0,7", "0,8", 
       "0,9", "1", "1,1", "1,2", "1,3", "1,4", "1,5", "1,7", "1,8", 
       "1,9", "11", "15,9", "2", "2,2", "2,3", "2,4", "2,5", "2,7", 
       "3,2", "3,3", "3,4", "3,5", "3,6", "3,7", "4,1", "4,2", "4,5", 
       "5", "5,1", "5,4", "5,9", "9,3", "9,5", "NoValue")
DFtest <- read.csv2(text=x, header=FALSE, stringsAsFactors = FALSE, na.strings = "NoValue")
str(DFtest)
Gruß, Jörg
Antworten