-9er in NA umwandeln

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

Moderatoren: EDi, jogo

Antworten
Lau
Beiträge: 7
Registriert: Do Okt 15, 2020 9:06 am

-9er in NA umwandeln

Beitrag von Lau »

Hallo Lau,

sorry, jetzt habe ich beim Antworten aus versehen Deine Frage überschrieben -- wir bekommen das aber dennoch hin. Für die anderen hier: Lau will in seinem Dataframe die Werte -9 durch NA ersetzen. Dafür hat er eine Lösung, die mit einigen wenigen Spalten funktioniert, aber nciht, wenn er alle Spalten mit reinnimmt. Hier nun meine Antwort:

Das ist ganz schrecklicher Code, der da nach und nach gewachsen ist. Sowas gehört aufgeräumt und lesbar geschrieben!

Code: Alles auswählen

Data.alles[c("gender", "age", "Bildabschl", "Wohnortgr","E101_01", "E101_02", "E101_03",	
             "E101_04", "E101_05", "E101_06","E101_07",	"E101_08", "E101_09",	"E101_10",	
             "E101_11", "XP01_01", "XP01_02", "XP01_10", "XP01_11", "XP01_12", "XP01_13",
             "XP01_14", "XP01_15", "CO_01", "CO_02", "CO_03", "CO_04", "CO_05", "CO_06", 
             "CO_07", "CO_08", "CO_29", "CO_30", "CO_31", "CO_32", "CO_09", "CO_10", 
             "CO_11", "CO_12", "CO_13", "CO_14", "CO_15", "CO_16", "CO_17", "CO_18",
             "CO_19", "CO_20", "CO_21", "CO_22", "CO_23", "CO_24", "CO_25", "CO_26",
             "CO_27", "CO_28", "W101_01", "W101_02", "W101_03", "W101_04", "W101_05", 
             "PK01_05", "PK01_10", "PK01_15","B211", "B212", "WS06", "B213", "WS02")][Data.alles[c("gender","age", "Bildabschl", "Wohnortgr","E101_01", 
                                                                                                   "E101_02", "E101_03","E101_04", "E101_05", "E101_06",
                                                                                                   "E101_07",	"E101_08", "E101_09",	"E101_10","E101_11", 
                                                                                                   "XP01_01", "XP01_02", "XP01_10", "XP01_11", "XP01_12", 
                                                                                                   "XP01_13", "XP01_14", "XP01_15", "CO_01", "CO_02", 
                                                                                                   "CO_03", "CO_04", "CO_05", "CO_06", "CO_07", "CO_08", 
                                                                                                   "CO_29", "CO_30", "CO_31", "CO_32", "CO_09", "CO_10", 
                                                                                                   "CO_11", "CO_12", "CO_13", "CO_14", "CO_15", "CO_16", 
                                                                                                   "CO_17", "CO_18", "CO_19", "CO_20", "CO_21", "CO_22", 
                                                                                                   "CO_23", "CO_24", "CO_25", "CO_26", "CO_27", "CO_28", 
                                                                                                   "W101_01", "W101_02", "W101_03", "W101_04", "W101_05", 
                                                                                                   "PK01_05", "PK01_10", "PK01_15","B211", "B212", "B213",
                                                                                                   "WS02")]==-9] <- NA
Im Wesentlichen sehe ich da zwei Vektoren mit Spaltennamen, die übereinstimmen mit Ausnahme des Spaltennamens WS06, der kommt in der ersten aber nicht in der zweiten Liste vor. Kann das schon der Fehler sein?

Wenn Du aus dieser einen Code-Zeile ein paar mehr gemacht hättest, hättest Du das nach und nach testen und den Fehler eingrenzen können. Programmiertechnisch ist aber wahrscheinlich die doppelte Auflistung der Spaltennamen das Problem: Wenn es zuviele werden, dann schleichen sich Fehler ein. Ein möglicher Ansatz wäre es, nur eine Liste mit solchen Spaltennamen zu haben und darüber mit einer Schleife zu laufen. Wenn in Deinem gesamten Dataframe alle Werte -9 durch etwas ausgetausch werden sollen, kannst Du auch mit apply jede Zelle einzeln bearbeiten:

Code: Alles auswählen

beispiel <- as.data.frame(matrix(sample(x = c(-9, 1:8), size = 200, replace = TRUE), ncol = 20))
print(beispiel)
ergebnis <- apply(beispiel, c(1, 2), function(x) if(x==-9) NA else x)
print(ergebnis)
LG,
Bernhard
jogo
Beiträge: 2093
Registriert: Fr Okt 07, 2016 8:25 am

Re: -9er in NA umwandeln

Beitrag von jogo »

Hallo Lau,

wenn NA-Wert in einer Text- oder CSV-Datei speziell kodiert sind, z.B. wie bei Dir mit "-9", dann kann/sollte man dies gleich beim Einlesen der Datei behandeln. Die Funktionen zum Einlesen (read.table(), read.csv(), ...) haben hierfür das Argument na.strings= mit der Standardbelegung na.strings = "NA".
Für Dich wäre es wahrscheinlich angebracht, dieses Argument zu modifizieren, z.B.

Code: Alles auswählen

na.strings = c("-9", "NA")
Gruß, Jörg
Lau
Beiträge: 7
Registriert: Do Okt 15, 2020 9:06 am

Re: -9er in NA umwandeln

Beitrag von Lau »

Ich bin so super glücklich, über zwei so gute Antworten in so schneller Zeit! Vielen Dank, ihr seid toll!!

@Jörg: das Problem bei mir ist, dass manche Variablen, die eine -9 haben, auch eine -9 behalten sollen. Bspw. gab es eine Frage, die nur beantwortet werden sollte, wenn man Kinder hat. Dann würden ja alle kinderlosen aus meiner Analyse fallen, wenn sie bei diesem Item berechtigterweise eine -9 angeben. War bei der Fragebogenkonzipierung wahrscheinlich nicht klug gelöst.

@Bernhard: Du hast die Lösung gefunden!! jetzt klappt es!

Tausend Danke an euch beide :)
Lau
Beiträge: 7
Registriert: Do Okt 15, 2020 9:06 am

Re: -9er in NA umwandeln

Beitrag von Lau »

Oder habt ihr da trotzdem noch eine geschicktere Lösung für mich, außer diesen Mammut Befehl?
jogo
Beiträge: 2093
Registriert: Fr Okt 07, 2016 8:25 am

Re: -9er in NA umwandeln

Beitrag von jogo »

Hallo Lau,
Lau hat geschrieben: Fr Okt 30, 2020 11:19 am @Jörg: das Problem bei mir ist, dass manche Variablen, die eine -9 haben, auch eine -9 behalten sollen.
auch hierfür könnte ich mir eine kreative Lösung vorstellen:
1. zweimal einlesen: einmal mit und einmal ohne modifizierten Parameter
2. aus den beiden Dataframes die Daten neu zusammenstellen
Bspw. gab es eine Frage, die nur beantwortet werden sollte, wenn man Kinder hat. Dann würden ja alle kinderlosen aus meiner Analyse fallen, wenn sie bei diesem Item berechtigterweise eine -9 angeben. War bei der Fragebogenkonzipierung wahrscheinlich nicht klug gelöst.
Hier sehe ich noch nicht, was man durch Umwandlung von "-9" in NA beim Einlesen verkehrt macht, denn die Daten (also z.B. sämtliche Beobachtungen) bleiben erhalten.
Wie man mit den NA-Werten umgeht, unterliegt der Logik der späteren Auswertung.

Gruß, Jörg
jogo
Beiträge: 2093
Registriert: Fr Okt 07, 2016 8:25 am

Re: -9er in NA umwandeln

Beitrag von jogo »

Lau hat geschrieben: Fr Okt 30, 2020 11:30 am Oder habt ihr da trotzdem noch eine geschicktere Lösung für mich, außer diesen Mammut Befehl?
Man kann den Befehl um knapp die Hälfte reduzieren:

Code: Alles auswählen

Spalten <- c(...)
Data.alles[Spalten][Data.alles[Spalten]==-9] <- NA
Gruß, Jörg
bigben
Beiträge: 2894
Registriert: Mi Okt 12, 2016 9:09 am

Re: -9er in NA umwandeln

Beitrag von bigben »

Ich werfe mal eine Umwandlungslösung in die Runde, die jede Spalte genau einmal erwähnt. Ich nehme das Package magrittr in Anspruch, finde das aber sehr anfängerfreundlich und sehr übersichtlich:

Code: Alles auswählen

beispiel <- as.data.frame(matrix(sample(x = c(-9, 1:8), size = 200, replace = TRUE), ncol = 20))
print(beispiel)


library(magrittr)
neun.zu.na <- function(x) ifelse(x == -9, NA, x)

# und jetzt für jede betreffende Spalte einmal aufrufen

beispiel$V1 %<>% neun.zu.na()
beispiel$V2 %<>% neun.zu.na()
beispiel$V3 %<>% neun.zu.na()
beispiel$V4 %<>% neun.zu.na()
beispiel$V5 %<>% neun.zu.na()
beispiel$V6 %<>% neun.zu.na()
beispiel$V7 %<>% neun.zu.na()
beispiel$V28 %<>% neun.zu.na()

print(beispiel) # nur für die aufgerufenen Spalten erfolgt
Was mir daran besonders gut gefällt ist die leicht verständliche Fehlermeldung für die "falsche" Code-Zeile.

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