NA behalten in subset

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

Moderatoren: EDi, jogo

electricEH
Beiträge: 19
Registriert: Sa Mär 16, 2019 11:46 am

NA behalten in subset

Beitrag von electricEH »

Hallo zusammen,
ich möchte einzelne Zeilen aus meinem Datensatz löschen (z.B. hier alle, die bei v_1 "Baum" eingegeben haben) und wollte dazu die subset-Funktion nutzen:

data <- subset(data, v_1 != "Baum")

Das Problem ist jetzt, dass RStudio nicht nur diese Zeilen löscht, sondern auch alle, die bei v_1 NA haben. Kann mir jemand sagen, wie ich das verhindern kann?

Vielen Dank schonmal!
Hufeisen
Beiträge: 162
Registriert: Fr Aug 31, 2018 6:34 pm

Re: NA behalten in subset

Beitrag von Hufeisen »

Code: Alles auswählen

# Beispieldaten erzeugen
forum <- data.frame(v_1 = c("Baum", NA, "rosa", "blau", "gelb", "Baum", NA), v_2 = letters[1:7])
forum

# das Problem
subset(forum, v_1 != "Baum")

# das Problem gelöst - edit: löst es gar nicht
subset(forum, v_1 != "Baum", na.rm = FALSE)

# alternative Lösung - edit: auch nicht
forum[forum$v_1 != "Baum", ]
Ich habe noch eine zweite Möglichkeit angegeben, da in der Hilfe zu subset Folgendes steht:
Warning

This is a convenience function intended for use interactively. For programming it is better to use the standard subsetting functions like [, and in particular the non-standard evaluation of argument subset can have unanticipated consequences.
Zuletzt geändert von Hufeisen am Sa Mär 16, 2019 3:59 pm, insgesamt 2-mal geändert.
Athomas
Beiträge: 769
Registriert: Mo Feb 26, 2018 8:19 pm

Re: NA behalten in subset

Beitrag von Athomas »

# alternative Lösung
forum[forum$v_1 != "Baum", ]
Das funktioniert nicht, NA (wie auch immer!) verglichen mit "Baum" ergibt NA!

Die meiner Meinung nach "natürliche" Antwort auf die Frage wäre:

Code: Alles auswählen

subset(data, v_1 != "Baum" | is.na(v_1))
Den Einwand zur Benutzung von "subset" kenne ich, trotzdem verwende ich diese Funktion seit Jahr und Tag bei "normalen" Dataframes!
Eine der wenigen mächtigen Funktionen in R, an deren Syntax man sich auch nach Wochen noch erinnert :lol: !
Hufeisen
Beiträge: 162
Registriert: Fr Aug 31, 2018 6:34 pm

Re: NA behalten in subset

Beitrag von Hufeisen »

Da hast du Recht. Tatsächlich lösen beide Varianten von mir das Problem nicht oder nicht zufriedenstellend. Was habe ich mir das vorhin nur eingebildet, auf dem Schirm zu sehen? :oops:
electricEH
Beiträge: 19
Registriert: Sa Mär 16, 2019 11:46 am

Re: NA behalten in subset

Beitrag von electricEH »

Ganz vielen Dank, das hat mir sehr geholfen!

Ich habe jetzt außerdem noch eine Variable, die die wöchentliche Arbeitszeit erfasst. Das sollte eigentlich eine numerische Variable sein, ist es aber irgendwie nicht (wenn ich is.numeric() eingebe, kommt FALSE heraus und wenn ich ein subset erzeugen will aus allen Fällen, die mind. 5 Stunden pro Woche arbeiten, kommt die Fehlermeldung: In Ops.factor(v_330, 5) : ‘>’ not meaningful for factors

Kann mir jemand sagen, wie ich die Variable in eine numerische umwandeln kann? Ich habe es schon mit as.numeric() versucht, aber das klappt nicht, vor allem kommen dann auch falsche Zahlen raus (z.B. bei summary(as.numeric(data$v_330))) und die Nachkommastellen sind einfach weg.
Hufeisen
Beiträge: 162
Registriert: Fr Aug 31, 2018 6:34 pm

Re: NA behalten in subset

Beitrag von Hufeisen »

Dieses mal hat mich unsere Tochter ausschlafen lassen :D. as.numeric() ist schon richtig, klappt aber nicht mit Faktoren. Man muss es mit as.character() kombinieren.

Code: Alles auswählen

# Faktor erstellen
forum <- data.frame(einFaktor = as.factor(c(1:10)))
str(forum)

# umkodieren
forum$keinFaktor <- as.numeric(as.character(forum$einFaktor))
str(forum)

# Output
'data.frame':	10 obs. of  2 variables:
 $ einFaktor : Factor w/ 10 levels "1","2","3","4",..: 1 2 3 4 5 6 7 8 9 10
 $ keinFaktor: num  1 2 3 4 5 6 7 8 9 10
electricEH
Beiträge: 19
Registriert: Sa Mär 16, 2019 11:46 am

Re: NA behalten in subset

Beitrag von electricEH »

Das versteh ich nicht so ganz. Wozu ist der Vektor von 1 bis 10 da und muss ich das irgendwie anpassen?
Und steht forum für den gesamten Datensatz, den ich nutze oder ist das ein neu erzeugter Datensatz?
Athomas
Beiträge: 769
Registriert: Mo Feb 26, 2018 8:19 pm

Re: NA behalten in subset

Beitrag von Athomas »

Kann mir jemand sagen, wie ich die Variable in eine numerische umwandeln kann?
Am allerbesten wäre natürlich, die Daten direkt richtig einzulesen - ich nehme an, Du nutzt read.table oder Ähnliches!?

Sobald read.table etwas nicht als Zahl interpretieren kann (da reicht ein "falsches" Zeichen) wird die komplette Variable als Character eingelesen, und wenn dann noch default.stringsAsFactors() auf TRUE steht - was in der Regel so ist - wird das ganze Zeug in einen Faktor konvertiert...
electricEH
Beiträge: 19
Registriert: Sa Mär 16, 2019 11:46 am

Re: NA behalten in subset

Beitrag von electricEH »

Ja, es liegt daran, dass in einem Fall Buchstaben eingegeben wurden. Ich habe read.csv() genutzt. Kann ich denn irgendwie verhindern, dass die Variable dann als character eingelesen wird? Am besten wäre, wenn der eine Fall mit den Buchstaben dann einfach als NA gilt.
Hufeisen
Beiträge: 162
Registriert: Fr Aug 31, 2018 6:34 pm

Re: NA behalten in subset

Beitrag von Hufeisen »

electricEH hat geschrieben: So Mär 17, 2019 6:32 pm Das versteh ich nicht so ganz. Wozu ist der Vektor von 1 bis 10 da und muss ich das irgendwie anpassen?
Und steht forum für den gesamten Datensatz, den ich nutze oder ist das ein neu erzeugter Datensatz?
Das ist einfach nur ein Beispieldatensatz zum Zeigen. Den Befehl as.numeric(as.character()) musst Du auf deine betreffenden Spalten anwenden. Um die Daten von vornherein richtig einzulesen, hilft das Argument colClasses = "DATENTYP". Wobei DATENTYP für logical, integer, numeric, complex, character, raw steht.
Antworten