Gesamte Zeile löschen, wenn in allen 7 relevanten Spalten "NA"

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

Moderatoren: EDi, jogo

Antworten
Lea
Beiträge: 2
Registriert: Di Mai 02, 2023 10:45 am

Gesamte Zeile löschen, wenn in allen 7 relevanten Spalten "NA"

Beitrag von Lea »

Hallo liebes Forum,

ich muss für meine Masterarbeit mit R rechnen und habe einen riesigen Datensatz im Long-Format.
Ich würde gerne alle Zeilen löschen, in denen alle 7 relevanten Variablen ein NA aufweisen (nicht aber, wenn es in nur in manchen davon ist). Ich kriege aber leider den Befehl dazu nicht hin. Meine eigentliche Idee war, einfach folgenden Befehl zu verwenden:

data[ ! ( ( data$Variable1 ==1 & data$Variable2 ==1 )) , ]

und das "nicht aufnehmen, wenn Variable 1 und Variable 2 = 1 sind" für mich umzuändern zu "nicht aufnehmen, wenn Variablen 1-7 keinen Wert haben", allerdings habe ich Probleme damit, das NA in den Code einzubinden. Es funktioniert weder mit ==NA noch ==is.na oder =is.na

(Mein Code war z. B. wie folgt:
data_long2[ ! ( ( data_long$CommunionScore = is.na & data_long$Agency_Score = is.na & data_long$ElectabilityScore = is.na & data_long$Likeliness_to_vote=is.na & data_long$Likeliness_City_Council =is.na & data_long$Likeliness_Schoolboard=is.na & data_long$Likeliness_House_of_Representatives=is.na )) , ]


Hat jemand eine Idee für mich, wie ich den Code abändern kann oder mit welchem alternativen Befehlen ich das gleiche erreichen kann?

Falls es relevant ist, hier noch ein paar mehr Infos zum Code.
Ich habe 674 Versuchspersonen und es gab insgesamt 32 Targets, die auf 7 Variablen bewertet wurden, jede Versuchsperson hat allerdings nur eine randomisierte Auswahl von 8 Targets gesehen. Da es ein Longformat ist, hat jede der 32 Targets untereinander eine Zeile pro Versuchsperson, also Target 1 hat 674 Zeilen, dann kommt Target 2 mit 674 Zeilen etc. bis Target 32. Da allerdings jedes Target nur von einem Viertel der Versuchspersonen bewertet wurde (da diese ja nur 8/32 gesehen haben), sind Dreiviertel der Zeilen leer. Diese würde ich gerne löschen. Da es aber auch vorkommt, dass eine Versuchsperson ein Target zwar bewertet hat, aber nicht alle 7 Variablen sondern z.B. nur 6 beantwortet hat, kann ich Zeilen nicht wegen eines einzelnen NA löschen lassen. Mein Plan wäre daher, irgendwie eine If-Schleife zu haben, also dass Zeilen nur dann gelöscht werden, wenn in allen 7 relevanten Variablen ein NA steht, weil das bedeutet, dass das Target von diesen Versuchspersonen nicht bewertet wurde (und nicht, dass lediglich einzelne Fragen zum Target nicht beantwortet wurden).

Vielen lieben Dank für eure Hilfe!!
Liebe Grüße
Lea
bigben
Beiträge: 2777
Registriert: Mi Okt 12, 2016 9:09 am

Re: Gesamte Zeile löschen, wenn in allen 7 relevanten Spalten "NA"

Beitrag von bigben »

Hallo Lea,

ich bin nicht wirklich sicher, ob ich Dein Datenformat richtig verstanden habe. Ich rate Dir dringend, bei Anfragen hier möglichst immer Beispieldaten mitzuliefern, am besten in R-lesbarer Form.

Ich antworte erstmal an Beispieldaten, dafür erzeugen wir einen Beispieldataframe wie folgt:

Code: Alles auswählen

set.seed(8)
bsp <- data.frame(matrix(sample(c(NA, NA, NA, 1:3), 7000, 1), ncol = 7))
head(bsp)
Das sind 7 Spalten und 1000 Zeilen mit ziemlich viel NA drin. Jetzt fragen wir R für jede Zeile, ob da ausschließlich NA drin sind:

Code: Alles auswählen

# Für jede Zeile: Besteht sie nur aus NA?
leer <- apply(bsp, 1, \(x) all(is.na(x)))
head(leer, 20)
Und wir können uns auch ausgeben lassen, welche Zeilennummern das sind:

Code: Alles auswählen

# welche Zeilen sind denn nun leer? 
which(leer)

# schauen wir nach, ob's stimmt:
bsp[433:448,]  # Zeile 434 und 447 sollen nur NA enthalten.
Wenn es denn unbedingt eine for Schleife sein sollte, dann könnte man die Zeilennummern auch so finden:

Code: Alles auswählen

for(i in 1:nrow(bsp))
  if(all(is.na(bsp[i,]))) print(i)
Hilft das in dieser Form weiter? Mehr darüber, wie Du Deine konkreten Daten anschaulich machen kannst mit einem computerlesbaren Datenbeispiel findest Du z. B. hier: viewtopic.php?t=11

LG,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
bigben
Beiträge: 2777
Registriert: Mi Okt 12, 2016 9:09 am

Re: Gesamte Zeile löschen, wenn in allen 7 relevanten Spalten "NA"

Beitrag von bigben »

So, ich habe das oben erklärte nochmal zu einer praktischen Funktionsdefinition zusammengefasst.
Folgende Zeilen definieren eine neue Funktion delete.rows.of.na

Code: Alles auswählen

delete.rows.of.na <- function(dafra, cols = 1:ncol(dafra), silent = FALSE){
  relevant <- which(apply(dafra[,cols], 1, \(x) all(is.na(x))))
  if(!silent){
     cat("deleting row(s) ")
     cat(relevant)
     cat("\n")
  }
  dafra[-relevant,]
}
Wir brauchen ein kleineres Beispiel als bsp oben und schaffen uns das mit bsp2

Code: Alles auswählen

bsp2 <- bsp[c(1:3, 746, 753, 761, 779, 793),]
print(bsp2)
Da können wir jetzt alle Zeilen löschen, in allen Spalten nur NA stehen haben:

Code: Alles auswählen

delete.rows.of.na(bsp2)
Oder eben nur die Zeilen löschen, die in den Spalten 4 bis 6 NA stehen haben, egal was in den anderen Spalten steht:

Code: Alles auswählen

delete.rows.of.na(bsp2, 4:6)
# bzw wenn die gelöschten Zeilen nicht aufgeführt werden sollen:
delete.rows.of.na(bsp2, 4:6, silent = TRUE)
HTH,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
Lea
Beiträge: 2
Registriert: Di Mai 02, 2023 10:45 am

Re: Gesamte Zeile löschen, wenn in allen 7 relevanten Spalten "NA"

Beitrag von Lea »

Hallo Bernhard,

vielen vielen Dank, die Funktion macht genau das, was ich gesucht habe! Das rettet mir gerade den Tag, danke für deine Mühen und super Erklärung!

Liebe Grüße
Lea
Antworten