2 Variablen auf fehlende Werte/Personen untersuchen

Allgemeine Statistik mit R, die Test-Methode ist noch nicht bekannt, ich habe noch keinen Plan!

Moderatoren: EDi, jogo

R_Student
Beiträge: 14
Registriert: Di Jun 02, 2020 4:22 pm

2 Variablen auf fehlende Werte/Personen untersuchen

Beitrag von R_Student »

Hi ihr Lieben,

Ich habe folgendes Problem ich habe mit merge 2 Datensätze zusammen gefügt (Strategie_Basis_Daten <- merge(Strategie.Daten, Basis_Daten, by="CODE"), dabei sind 3 Personen "verloren" gegangen, da sie anscheinend nicht im Basis-Datensatz vorhanden sind. Ich versuche jetzt den Code dieser Personen herauszufinden (da es sich um über 500 Personen handelt ist das händisch schlecht machbar). Ich möchte also die Variable CODE (string/Zeichenvariable) der beiden Datensätzen Strategie.Daten (512 Pers.) und Strategie_Basis_Daten (509 Pers.) vergleichen und mir den Code der fehlenden Personen ausgeben lassen. Ist das möglich?

Ich bin leider ein kompletter Neuling in R und sitze am meiner Masterarbeit.
Ich hoffe jemand hat eine Idee.

LG
Lea
jogo
Beiträge: 2086
Registriert: Fr Okt 07, 2016 8:25 am

Re: 2 Variablen auf fehlende Werte/Personen untersuchen

Beitrag von jogo »

Hallo Lea,

dafür gibt es Parameter bei merge().
Schau mal in die Doku.
all = ..., all.x = ..., all.y = ...

... anschließend schauen, wo im Ergebnis von merge() NAs sind.

Gruß, Jörg
bigben
Beiträge: 2781
Registriert: Mi Okt 12, 2016 9:09 am

Re: 2 Variablen auf fehlende Werte/Personen untersuchen

Beitrag von bigben »

R_Student hat geschrieben: Do Jun 04, 2020 8:31 am Ich möchte also die Variable CODE (string/Zeichenvariable) der beiden Datensätzen Strategie.Daten (512 Pers.) und Strategie_Basis_Daten (509 Pers.) vergleichen und mir den Code der fehlenden Personen ausgeben lassen.
Halloi Lea,

ich glaube, Du kannst Dir den Vergleich mit setdiff basteln. Das beantwortet die Frage "Was ist in der erstgenannten Menge drin, was in der zweiten nicht drin ist. Vorsichtig, es kommt auf die Reihenfolge der Argumente an. Zur Erläuterung:

Code: Alles auswählen

a <- c("Frank", "Steffi", "Hans")
b <- c("Hubert", "Steffi")

setdiff(a, b)
setdiff(b, a)
LG,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
R_Student
Beiträge: 14
Registriert: Di Jun 02, 2020 4:22 pm

Re: 2 Variablen auf fehlende Werte/Personen untersuchen

Beitrag von R_Student »

Vielen Dank hat wunderbar geklappt!
jogo
Beiträge: 2086
Registriert: Fr Okt 07, 2016 8:25 am

Re: 2 Variablen auf fehlende Werte/Personen untersuchen

Beitrag von jogo »

hier noch eine kleine Spielerei von mir:

Code: Alles auswählen

a <- c("Frank", "Steffi", "Hans", "Steffi", "Hans")
b <- c("Hubert", "Steffi")

setdiff(a, b)
unique(a[!(a %in% b)]) ## gleiches Ergebnis wie setdiff(a, b)
table(a)
Gruß, Jörg
R_Student
Beiträge: 14
Registriert: Di Jun 02, 2020 4:22 pm

Re: 2 Variablen auf fehlende Werte/Personen untersuchen

Beitrag von R_Student »

Vielen Dank für eure Antworten. Ich habe die fehlenden Werte mit Jörgs Vorschlag (merge und dann NA anschauen) relativ schnell entdeckt. Anscheinend ist ein Fehler in der Kodierung der Personen passiert. Diesen möchte ich jetzt beheben und habe es so ausprobiert:

Code: Alles auswählen

str_replace(CODE, "A524P16", "A524P17") #ich möchte also den Code A524P16 mit dem Code A524P17 ersetzen
str_replace(CODE, "A600P17", "A600P16")
str_replace(CODE, "A234P18", "A234P17")

Code: Alles auswählen

grep("A524P17", CODE) 
grep("A600P16", CODE)
grep("A234P17", CODE)
hier bekomme ich dann jeweils integer(0) als Ausgabe
das Ersetzen hat also nicht funktioniert (ich bekomme allerdings keine Fehlermeldung sondern eine Liste mit den Codes als Ausgabe). Ich habe das ganze auch schon mit gsub ausprobiert, aber leider funktioniert das auch nicht

Weiß jemand wo mein Fehler liegt?
Zuletzt geändert von jogo am Di Jun 09, 2020 3:29 pm, insgesamt 1-mal geändert.
Grund: Formatierung verbessert. http://forum.r-statistik.de/viewtopic.php?f=20&t=29
bigben
Beiträge: 2781
Registriert: Mi Okt 12, 2016 9:09 am

Re: 2 Variablen auf fehlende Werte/Personen untersuchen

Beitrag von bigben »

Etwas in der Art?

Code: Alles auswählen

# Zeilen finden
zeilennr <- which(Strategie_Basis_Daten$Code ==  "A524P16")

# Zeile ändern
Strategie_Basis_Daten[zeilennr, "Code"] <- "A524P17"
LG,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
R_Student
Beiträge: 14
Registriert: Di Jun 02, 2020 4:22 pm

Re: 2 Variablen auf fehlende Werte/Personen untersuchen

Beitrag von R_Student »

Hi Bernhard,
danke für die Idee.

Code: Alles auswählen

zeilennr <- which(Strategie_Basis_Daten$Code ==  "A524P16") # hier kommt nur integer(0) raus
mit grep habe ich allerdings die Stelle identifiziert und es so versucht:

Code: Alles auswählen

# Zeile ändern
Strategie.Daten[252, "CODE"] <- "A524P16"

dann bekomme ich folgende Warnmeldung:

Code: Alles auswählen

Warnmeldung:
In `[<-.factor`(`*tmp*`, iseq, value = "6524P16") :
  invalid factor level, NA generated
Ich nehme mal an weil "CODE" zwar Zeichen enthält ich aber dies beim einlesen mit SPSS nicht als Zeichenvektor deklariert habe (sondern R es als Faktor abgespeichert hat). Also habe ich dies beim einlesen angepasst und den Zusatz "stringsAsFactors = FALSE" eingefügt . Jetzt funktioniert es (aber nur wenn ich keinen Datensatz attached habe!)
Vielen Dank!

Leider ist nun ein neues Problem aufgetreten als ich versucht habe die Datensätze (Strategie und Basis) wieder zusammenzufügen:

Code: Alles auswählen

Strategie_Basis_Daten_kor <- merge(Strategie.Daten, Basis_Daten, by="CODE")
#hier entsteht ein Datensatz mit null Observation (bzw. Personen). Komischerweise funktioniert dies nur mit diesen beiden Datensätzen nicht. Ich habe auch noch mal versucht mit der alten Syntax und "CODE" als Faktor (also wie es vorher war) den Datensatz zu berechnen und wieder entsteht ein Datensatz mit null observations

Code: Alles auswählen

Test <- merge(Outcome, Praediktoren, by="CODE") 
# dies hier funktioniert hingegeben wieder. Es scheint also nicht an dem Zeichenvektor zu liegen.
Wäre klasse, wenn jemand einen Rat weiß! Entschuldigt bitte das ich so viele Fragen habe! Wie gesagt R ist mir noch sehr fremd.
Zuletzt geändert von jogo am Mi Jun 10, 2020 1:58 pm, insgesamt 1-mal geändert.
Grund: Formatierung verbessert. http://forum.r-statistik.de/viewtopic.php?f=20&t=29
bigben
Beiträge: 2781
Registriert: Mi Okt 12, 2016 9:09 am

Re: 2 Variablen auf fehlende Werte/Personen untersuchen

Beitrag von bigben »

Da wäre jetzt ein reproduzierbares Minimalbeispiel angebracht:
https://stackoverflow.com/help/minimal- ... le-example
viewtopic.php?f=20&t=11

LG,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
R_Student
Beiträge: 14
Registriert: Di Jun 02, 2020 4:22 pm

Re: 2 Variablen auf fehlende Werte/Personen untersuchen

Beitrag von R_Student »

Hey hab hier mal ein vereinfachtes Beispiel erstellt. Dieses funktioniert jedoch :?:

Code: Alles auswählen

library(foreign)
library(plyr)
library(dplyr)
library("car")
library(stringr)

# orginal Datensatz: Datensatz1 <- read.spss("Datensatz1", to.data.frame = TRUE, use.value.labels = FALSE, stringsAsFactors = FALSE)
# hab ich jetzt hier nicht ganz perfekt mal als Beispiel vereinfacht:
CODE <- c("AB1","AB1","CD2","CD2","EF3")
as.character(CODE)
Variable1 <- c(1,3,2,1,3)
DatensatzMatrix1 <- rbind(CODE,Variable1)
Datensatz1 <- as.data.frame(t(DatensatzMatrix1))
rm(CODE)
# der Datensatz enthält normalerweise mehrere ordinalskallierte Variablen (welche nicht in Datensatz4 enthalten sind ) und die Variable CODE (als ID für #die Person),dieser besteht aus Zahlen und Buchstaben und stimmt mit den CODE-Namen aus Datensatz 4 bei 500 Personen überein

Code: Alles auswählen

library(tidyr)
attach(Datensatz1)

Personenebene <- group_by(Datensatz1, CODE)

Datensatz2 <- summarise(Personenebene, MW_Variable1 = mean(Variable1,na.rm = TRUE)) 
#hier gibt es eine Fehlermeldung, aber nur in diesem Bsp. bei meinen Datensätzen funktioniert es. Daher uninteressant für mich.

detach(Datensatz1) 
rm(Personenebene)

CODE <- c("AB1","CD2", "EF3", "GH4")
as.character(CODE)
Variable2 <- c(1,2,3,4)
DatensatzMatrix2 <- rbind(CODE,Variable2)
Datensatz3 <- as.data.frame(t(DatensatzMatrix2))

#Der orginal Datensatz: (Datensatz3 <-read.spss("Datensatz3",  to.data.frame = TRUE, use.value.labels = FALSE, stringsAsFactors = FALSE) )
# enthält mehrere Variablen und Personen (CODE) die nicht im vorherigen Datensatz vorhanden sind, 
# nicht enthaltene Personen sollen wegfallen die Variablen bzw. Werte auf den Variblen
# für die Personen in Datensatz 2 jedoch nicht daher dieser Ansatz: 

Datensatz4 <- merge(Datensatz2, Datensatz3, by="CODE") 
# das komische: hier funktioniert merge wieder. bei mir kommt jedoch ein Datensatz mit 0 observations raus  :?:
Zuletzt geändert von jogo am Do Jun 11, 2020 2:15 pm, insgesamt 1-mal geändert.
Grund: Formatierung verbessert. http://forum.r-statistik.de/viewtopic.php?f=20&t=29
Antworten