Datenimport: Dezimalzahlen und Datentyp nicht erkannt

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

Moderatoren: EDi, jogo

Antworten
magewie
Beiträge: 7
Registriert: Di Mär 16, 2021 6:36 pm

Datenimport: Dezimalzahlen und Datentyp nicht erkannt

Beitrag von magewie »

Hallo R-Community,

beim Einlesen einer .csv Textdatei in R mittels read_csv() werden, abgesehen von einer Variablen (Jahr 2019) im character-type, alle weiteren Variablen (2000:2018) im double-type dargestellt. In Excel werden mir alle (Original)Werte als Dezimalzahlen (mit Komma) angezeigt, in R dann jedoch nur noch die Werte der character-type Spalte. Wie lese ich hier korrekt ein?

Nun habe ich bereits den Operator read_csv2() ausprobiert, so wird der Datensatz noch inkorrekter importiert. Mit read.csv jedoch ist alles in Ordnung. Ich würde jedoch gern im tibble-Format weiterarbeiten. Hat jemand einen schnellen Einfall, was schiefgelaufen ist?

Im Anhang der Datensatz.csv.

Vielen Dank für die Hilfe im Vorraus und liebe Grüße
Magewie
Dateianhänge
Energie und Umwelt_Immissionen.csv
(2.1 KiB) 86-mal heruntergeladen
schubbiaschwilli
Beiträge: 253
Registriert: Di Jun 27, 2017 12:09 pm

Re: Datenimport: Dezimalzahlen und Datentyp nicht erkannt

Beitrag von schubbiaschwilli »

Gude!

Ich nehme an, du meinst "read.csv" - Was hast du für die Argumente sep und dec usw., und was würdest du erwarten? Für mich scheinen Double geeignet.
Ich würde aber eher die Rohdaten transponieren, das scheint mir sinnvoll.

Dank&Gruß
Schubbiaschwilli
magewie
Beiträge: 7
Registriert: Di Mär 16, 2021 6:36 pm

Re: Datenimport: Dezimalzahlen und Datentyp nicht erkannt

Beitrag von magewie »

Hallo und vielen Dank,

mit dem Operator "read.csv()" klappt alles, wie ich es mir vorstelle.

Ich möchte aber mit read(Unterstrich)csv() arbeiten. Hier wird mir nur die Variable 2019 im character type angezeigt, dafür aber wie ich es mir vorstelle und auch in Excel angezeigt wird, als Dezimalzahl (z.B. "156,30" statt, wie fälschlicherweise beim double type, "15630").

Mit dem Argument dec ="," habe ich es probiert. Ansonsten ist mir nicht viel mehr eingefallen.

Grüße,
Magewie

Eingabe:

kommstat_immissionen <- read_csv("Energie und Umwelt_Immissionen.csv")

Meldung in der Console:

Column specification ----------
cols(
.default = col_number(),
Kennziffer = col_character(),
Einheit = col_logical(),
`2000` = col_double(),
`2001` = col_double(),
`2002` = col_double(),
`2019` = col_character()
)
i Use `spec()` for the full column specifications.
schubbiaschwilli
Beiträge: 253
Registriert: Di Jun 27, 2017 12:09 pm

Re: Datenimport: Dezimalzahlen und Datentyp nicht erkannt

Beitrag von schubbiaschwilli »

Gude!

Hm, hast du dir die Datei mal in Notepad++ (oder so) angeschaut? csv-Dateien in xl anschauen, ist sehr gefährlich, da xl beim Import schon da rumformatiert.
Und wie bereits erwähnt, würde ich die Tabelle transponieren - Ansonsten wirst du mit den Daten in R nicht viel anfangen können.

Dank&Gruß
Schubbiaschwilli
magewie
Beiträge: 7
Registriert: Di Mär 16, 2021 6:36 pm

Re: Datenimport: Dezimalzahlen und Datentyp nicht erkannt

Beitrag von magewie »

Ich stehe noch am Anfang meiner R-Karriere und "Rohdaten transponieren" sagt mir vorerst nicht viel. Ich werde mich diesbezüglich mal informieren. Könnten Sie mir ein paar Punkte/Stichworte nennen auf die es ins Besondere dabei ankommt/ worauf man achten sollte?

Grüße
Magewie
Benutzeravatar
EDi
Beiträge: 1599
Registriert: Sa Okt 08, 2016 3:39 pm

Re: Datenimport: Dezimalzahlen und Datentyp nicht erkannt

Beitrag von EDi »

Ich möchte aber mit read(Unterstrich)csv() arbeiten.
Warum das denn?
Ich würde ja data.table::fread standardmäßig nehmen...


Na dann:

Code: Alles auswählen

library(readr)
read_csv("http://forum.r-statistik.de/download/file.php?id=1418", 
         locale = locale(decimal_mark = ","))
Es waren ja die dezimal trenner falsch, also hab ich danach mal in der Hilfe nachgeschaut und das gefunden
Aus ?read_csv

The locale controls defaults that vary from place to place. The default locale is US-centric (like R), but you can use locale() to create your own locale that controls things like the default time zone, encoding, decimal mark, big mark, and day/month names.
Nächster Schritt war dann ?locale zu lesen und zu sehen dass es ein Argument decimal_mark gibt.

R ist grundsätzlich anglo-zentrisch ausgerichtet und da ist der normal Trenner numal ein ".". Das muss man dann an seine Datei anpassen.
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.
magewie
Beiträge: 7
Registriert: Di Mär 16, 2021 6:36 pm

Re: Datenimport: Dezimalzahlen und Datentyp nicht erkannt

Beitrag von magewie »

Vielen Dank für diese Hilfestellung, es hat soweit alles geklappt und ich ich habe nun erkannt, dass eine grafische Darstellung der Daten schwierig ist, wenn die Variablen (Jahre) mit den Werten der ersten Variablen nicht vertauscht werden.

Nun habe ich transponiert, doch würde alle numerischen Werte des Datensatzes gern auf eine Nachkommastelle aufrunden. Ich habe es mit round() probiert, doch fehlt mir dort sicher ein weiteres Argument x. Auf dieses komme ich jedoch einfach nicht. Hier würde ich noch einmal um Hilfe bitten wollen! Außerdem hat es den data type nun von numerisch wieder auf character type umgestellt, kann ich dies bei der Transponierung irgendwie verhindern?
kommstat_immissionen <- read_csv("Energie und Umwelt_Immissionen.csv",
locale = locale(decimal_mark = ",")) %>%
t() %>%
round(digits = 1)
Vielen Dank und einen angenehmen Mittwoch!
magewie
Benutzeravatar
EDi
Beiträge: 1599
Registriert: Sa Okt 08, 2016 3:39 pm

Re: Datenimport: Dezimalzahlen und Datentyp nicht erkannt

Beitrag von EDi »

Ich würde nicht transponieren, sondern ins lange format bringen (z.B. tidyr::pivot_longer).
Außerdem hat es den data type nun von numerisch wieder auf character type umgestellt, kann ich dies bei der Transponierung irgendwie verhindern?
Alle elemente eines Spaltenvektors müssen in einem data.frame die selbe Klasse haben (alle numerisch, character, logisch etc). Wenn das nicht der Fall ist (z.B. c(1, "A")) , dann konvertiert R zur kleinsten gemeinsamen Typ (welcher character hier ist).
Das kommt durchs transponieren, deshalb auch mein vorschlag oben.
doch fehlt mir dort sicher ein weiteres Argument x.
round funktioniert mit Vektoren, siehe Hilfe. Du kannst nicht einen data.frame dem übergeben.
Siehe z.b. mutate, mutate_if, mutate_at etc um round auf mehrere Spaltenvektoren eines data.frames antuwenden.
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.
bigben
Beiträge: 2781
Registriert: Mi Okt 12, 2016 9:09 am

Re: Datenimport: Dezimalzahlen und Datentyp nicht erkannt

Beitrag von bigben »

Alternativ könnte man es auch ganz schlicht halten, und die Daten in Zeilen stehen lassen wie hier, in diesem lauffähigen Beispiel:

Code: Alles auswählen

immi <- read.csv("http://forum.r-statistik.de/download/file.php?id=1418", header = FALSE, dec = ",")

plot(2000:2019, immi[2,3:22], type = "b", col = 1, pch = 1, 
     ylim = c(0,80), xlab = "Jahr", ylab ="Immission") # erstmal ein geeignetes Koordinatensystem
abline(h = seq(0, 80, 10), col = "lightgrey", lty = 3)
points(2000:2019, immi[2,3:22], type = "b", col = 1, pch = 1) # Jahresmittel aus Zeile 2
points(2000:2019, immi[4,3:22], type = "b", col = 2, pch = 2) # Jahresmittel aus Zeile 4
points(2000:2019, immi[6,3:22], type = "b", col = 3, pch = 3) # Jahresmittel aus Zeile 6
points(2000:2019, immi[8,3:22], type = "b", col = 4, pch = 4) # Jahresmittel aus Zeile 8
points(2000:2019, immi[10,3:22], type = "b", col = 5, pch = 5) # Jahresmittel aus Zeile 10
points(2000:2019, immi[12,3:22], type = "b", col = 6, pch = 6) # Jahresmittel aus Zeile 12
legend("topright", col = 1:5, pch = 1:5, legend = c("Jahresmittel Z2", " Jahresmittel Z4", "Zeile 6", 
                                                    "Zeile8", "Jahresmittel Z10", 
                                                    "Jahresmittel Z12"), inset = .01)
                                                    
# Aufrunden:
immi[,3:22] <- ceiling(immi[,3:22])                                                     
Je mehr mit den Daten gemacht werden soll, umso sinnvoller ist das Transformieren oder Umwandeln ins Langformat. Ich wollte nur mal erwähnt haben, dass es für einfache Anforderungen durchaus auch einfach geht. Best practice geht sicher anders.

LG,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
Antworten