Neue Variable aus mehreren anderen Variablen erstellen

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

Moderatoren: EDi, jogo

Antworten
Janone
Beiträge: 9
Registriert: So Feb 24, 2019 3:51 pm

Neue Variable aus mehreren anderen Variablen erstellen

Beitrag von Janone »

Guten Tag,

ich bin noch ein Anfänger was R betrifft und habe folgendes Problem:

Ich möchte eine neue Variable "Arbeitsteilung" erstellen, bestehend aus diesen 5 Items:
  • V42 "preparing daily meals", V43 "doing the dishes", V44 "shopping for food", V45 "vacuuming the house", V46 "making small repairs"
Das sind die Ausprägungen der oben genannten Items:
1 - always me / 2 - usually me / 3 - both equally / 4 - usally my spouse / 5 - always my spouse / 6 - a third person

Da die Befragten von beiden Geschlechter sein können würde ich gerne die neue Variable "Arbeitsteilung" mit folgenden Ausprägungen erstellen:
(1) immer die Frau (2) normalerweise die Frau (3) Frau und Mann in etwa gleich (4) normalerweise der Mann (5) immer der Mann

Die Ausprägung der Variablen "SEX" sind folgendermaßen zu interpretieren: 1 = Frau / 2 = Mann

Habe das ganze versucht anhand diesen Befehls zu lösen (für Variable V42), was jedoch nicht aufgeht. Ich stelle mir einen Befehl vor, der ausführen kann: Wenn Frau (SEX==1) und mit 1 -always me bei V42 geantwortet -> dann auf neuer Skala 1

issp12n$arbeitst <- ifelse(issp12n$SEX==1|issp12n$V42==1, 1, 0) || ifelse(issp12n$SEX==1|issp12n$V42==2, 2, 0) || ifelse(issp12n$SEX==1|issp12n$SEX==2|issp12n$V42==3, 3, 0) || ifelse(issp12n$SEX==2|issp12n$V42==4, 4, 0) || ifelse(issp12n$SEX==2|issp12n$V42==5, 5, 0,)

Wenn ich dann für jede Variable eine neue Variable mit der neuen Skala erstellt hätte, würde ich mit der RowMeans-Funktion die neuen Variablen zusammenfassen und einen Index bilden.

Ich würde mich sehr über Hilfe oder Anregungen freuen!

Viele Grüße
Jörn
Hufeisen
Beiträge: 162
Registriert: Fr Aug 31, 2018 6:34 pm

Re: Neue Variable aus mehreren anderen Variablen erstellen

Beitrag von Hufeisen »

Hallo,

Die Funktion if(condition) expression akzeptiert als condition nur einen Vektor der Länge eins. Du müsstest also so eine Warnmeldung erhalten: "Bedingung hat Länge > 1 und nur das erste Element wird benutzt".
Ich habe es jetzt folgendermaßen gelöst und hoffentlich alles richtig verstanden:

Code: Alles auswählen

# Beispieldaten
forum <- data.frame(sex = sample(c(1,2), 10, replace = TRUE),
                    V42 = sample(c(1:6), 10, replace = TRUE),
                    V43 = sample(c(1:6), 10, replace = TRUE))

# Merkmalsausprägung Dritte Person löschen
forum[forum == 6] <- NA

# Neue Variable erstellen und Männer umpolen
forum$V42_sex <- forum$V42
forum$V42_sex[forum[1] == 2] <- 5 - forum$V42[forum[1] == 2] + 1 # Maximum - Wert + Minimum

forum$V43_sex <- forum$V43
forum$V43_sex[forum[1] == 2] <- 5 - forum$V43[forum[1] == 2] + 1 # Maximum - Wert + Minimum

# Variable Arbeitsteilung erstellen
forum$Arbeitsteilung <- rowMeans(forum[-c(1:3)], na.rm = TRUE)

# Output
forum
   sex V42 V43 V42_sex V43_sex Arbeitsteilung
1    1   1   2       1       2            1.5
2    1   5   2       5       2            3.5
3    2   4  NA       2      NA            2.0
4    1   1  NA       1      NA            1.0
5    2   1   4       5       2            3.5
6    2  NA   1      NA       5            5.0
7    1  NA   5      NA       5            5.0
8    1   3   2       3       2            2.5
9    1   3   2       3       2            2.5
10   1   1   1       1       1            1.0
Es geht bestimmt auch mit apply, aber damit habe ich es nicht hinbekommen Rechenoperationen, wie + und - rechnen zu lassen. Das muss ich mir noch einmal angucken. edit: apply(X, MARGIN, function(x) {x+1})
Es geht sicherlich auch mit deinem Ansatz. Dazu zwei Bemerkungen. Erstens hast du deine Bedingungen mit ODER "|" verknüpft, wolltest aber sicherlich UND "&" haben.

Code: Alles auswählen

forum$V42[forum$sex==1 & forum$V42 == 2]
Zweitens musst du deine ifelse-Folge verschachteln.

Code: Alles auswählen

ifelse(Bedingung1, Dann,
       ifelse(Bedingung2, Dann,
              ifelse...
Janone
Beiträge: 9
Registriert: So Feb 24, 2019 3:51 pm

Re: Neue Variable aus mehreren anderen Variablen erstellen

Beitrag von Janone »

Hallo Hufeisen,

vielen Dank für die schnelle Antwort und den Denkanstoß!! Habe mein Problem nun anhand der ifelse-Verschachtelung lösen können.

Code: Alles auswählen

issp12n$arbeitst1 <- ifelse(issp12n$SEX==1 & issp12n$V42==1, 1, + ifelse(issp12n$SEX==1 & issp12n$V42==2, 2, + ifelse(issp12n$SEX==1 | issp12n$SEX==2 & issp12n$V42==3, 3, + ifelse(issp12n$SEX==2 & issp12n$V42==2, 4, + ifelse(issp12n$SEX==2 & issp12n$V42==1, 5,NA)))))
issp12n$arbeitst2 <- ifelse(issp12n$SEX==1 & issp12n$V43==1, 1, + ifelse(issp12n$SEX==1 & issp12n$V43==2, 2, + ifelse(issp12n$SEX==1 | issp12n$SEX==2 & issp12n$V43==3, 3, + ifelse(issp12n$SEX==2 & issp12n$V43==2, 4, + ifelse(issp12n$SEX==2 & issp12n$V43==1, 5,NA)))))
issp12n$arbeitst3 <- ifelse(issp12n$SEX==1 & issp12n$V44==1, 1, + ifelse(issp12n$SEX==1 & issp12n$V44==2, 2, + ifelse(issp12n$SEX==1 | issp12n$SEX==2 & issp12n$V44==3, 3, + ifelse(issp12n$SEX==2 & issp12n$V44==2, 4, + ifelse(issp12n$SEX==2 & issp12n$V44==1, 5,NA)))))
issp12n$arbeitst4 <- ifelse(issp12n$SEX==1 & issp12n$V45==1, 1, + ifelse(issp12n$SEX==1 & issp12n$V45==2, 2, + ifelse(issp12n$SEX==1 | issp12n$SEX==2 & issp12n$V45==3, 3, + ifelse(issp12n$SEX==2 & issp12n$V45==2, 4, + ifelse(issp12n$SEX==2 & issp12n$V45==1, 5,NA)))))
issp12n$arbeitst5 <- ifelse(issp12n$SEX==1 & issp12n$V46==1, 1, + ifelse(issp12n$SEX==1 & issp12n$V46==2, 2, + ifelse(issp12n$SEX==1 | issp12n$SEX==2 & issp12n$V46==3, 3, + ifelse(issp12n$SEX==2 & issp12n$V46==2, 4, + ifelse(issp12n$SEX==2 & issp12n$V46==1, 5,NA)))))
issp12n$arbeitst6 <- ifelse(issp12n$SEX==1 & issp12n$V47==1, 1, + ifelse(issp12n$SEX==1 & issp12n$V47==2, 2, + ifelse(issp12n$SEX==1 | issp12n$SEX==2 & issp12n$V47==3, 3, + ifelse(issp12n$SEX==2 & issp12n$V47==2, 4, + ifelse(issp12n$SEX==2 & issp12n$V47==1, 5,NA)))))
bigben
Beiträge: 2778
Registriert: Mi Okt 12, 2016 9:09 am

Re: Neue Variable aus mehreren anderen Variablen erstellen

Beitrag von bigben »

@janone Schön, dass Dein Code jetzt für Dich funktioniert. Aber was Du geschrieben hast, ist ein beeindruckendes Meisterwerk der Verschleierungskunst. Wenn da jetzt ein Fehler drin ist, willst Du den suchen müssen? Wenn das ein Dritter zu lesen bekommt, wem willst Du das zumuten?

Welche der beiden folgenden Varianten ist lesbar, verständlich und recheneffizient? Bei welcher würde Dir eher auffallen, dass ein Komma oder eine Klammer falsch steht?

Code: Alles auswählen

forum$V42_sex <- forum$V42
forum$V42_sex[forum[1] == 2] <- 5 - forum$V42[forum[1] == 2] + 1 # Maximum - Wert + Minimum
versus

Code: Alles auswählen

issp12n$arbeitst1 <- ifelse(issp12n$SEX==1 & issp12n$V42==1, 1, 
  ifelse(issp12n$SEX==1 & issp12n$V42==2, 2,
  ifelse(issp12n$SEX==1 | issp12n$SEX==2 & issp12n$V42==3, 3, 
  ifelse(issp12n$SEX==2 & issp12n$V42==2, 4, 
  ifelse(issp12n$SEX==2 & issp12n$V42==1, 5,NA)))))
Ich mag an Deiner Version, dass die Variablen ihre Werte nicht verändern, das entspricht den Prinzipien der funktionalen Programmierung. Ansonsten solltest Du nochmal überlegen, ob Du Dir von Hufeisen nicht noch mehr abgucken könntest.

Außerdem solltest Du mal überlegen, ob es richtig ist, den Code durch copy&paste sechs mal für sechs Spalten laufen zu lassen oder ob man den Code vielleicht so umschreiben kann, dass er in einer for-Schleife 6mal aufgerufen wird. Beides nur als Vorschläge, wenn Du nicht nur lauffähigen Code schreiben, sondern noch etwas dazu lernen möchtest.

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

Re: Neue Variable aus mehreren anderen Variablen erstellen

Beitrag von bigben »

@Hufeisen
Hufeisen hat geschrieben: So Feb 24, 2019 9:18 pmEs geht bestimmt auch mit apply, aber damit habe ich es nicht hinbekommen...
Ich weiß nicht, was Du mit apply gewinnen willst - Deine voll vektorisierte Version ist doch klasse. Wenn Du gerne apply verwenden möchtest, hilft das hier vielleicht auf dem Weg:

Code: Alles auswählen

forum <- data.frame(sex = sample(c(1,2), 10, replace = TRUE),
                    V42 = sample(c(1:6), 10, replace = TRUE),
                    V43 = sample(c(1:6), 10, replace = TRUE))

swap <- function(row, column="V42"){  # eine dezidierte Funktion, die ich mit apply aufrufe werde
  if(row[column]==6) 
      return(6)  # ich erhalte die Antwort 6
  return(6-row[column])
}

forum$V42_swapped <- apply(forum, 1, swap)  # für die vorgegebene Spalte V42
forum$V43_swapped <- apply(forum, 1, function(row) swap(row, "V43"))  # für beliebige Spalten
HTH,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
Hufeisen
Beiträge: 162
Registriert: Fr Aug 31, 2018 6:34 pm

Re: Neue Variable aus mehreren anderen Variablen erstellen

Beitrag von Hufeisen »

bigben hat geschrieben: Mo Feb 25, 2019 3:16 pm @Hufeisen
Ich weiß nicht, was Du mit apply gewinnen willst - Deine voll vektorisierte Version ist doch klasse.
Janone ist ja neu, da wollte ich zum einen ein paar Möglichkeiten aufzeigen, wie man ein Problem lösen kann und seine/ihre Lösung mit verschachtelten ifelse Bedingungen ist zwar nicht schön, es ist aber gut, dass er/sie es probiert und richtig gelöst hat. Zum Anderen ist die Syntax von apply für mich immer noch eine Herausforderung, da ich oft in Schleifen denke. Das war also auch ein wenig Übung, die dann sofort an der Anwendung der Grundrechenarten gescheitert ist. Offtopic: Wobei in der Hilfe steht: " In the case of functions like +, %*%, etc., the function name must be backquoted or quoted." Das hat bei mir aber nur mit geschweiften Klammern geklappt.
Janone
Beiträge: 9
Registriert: So Feb 24, 2019 3:51 pm

Re: Neue Variable aus mehreren anderen Variablen erstellen

Beitrag von Janone »

bigben hat geschrieben: Mo Feb 25, 2019 2:58 pm @janone Schön, dass Dein Code jetzt für Dich funktioniert. Aber was Du geschrieben hast, ist ein beeindruckendes Meisterwerk der Verschleierungskunst. Wenn da jetzt ein Fehler drin ist, willst Du den suchen müssen? Wenn das ein Dritter zu lesen bekommt, wem willst Du das zumuten?

Welche der beiden folgenden Varianten ist lesbar, verständlich und recheneffizient? Bei welcher würde Dir eher auffallen, dass ein Komma oder eine Klammer falsch steht?

Code: Alles auswählen

forum$V42_sex <- forum$V42
forum$V42_sex[forum[1] == 2] <- 5 - forum$V42[forum[1] == 2] + 1 # Maximum - Wert + Minimum
versus

Code: Alles auswählen

issp12n$arbeitst1 <- ifelse(issp12n$SEX==1 & issp12n$V42==1, 1, 
  ifelse(issp12n$SEX==1 & issp12n$V42==2, 2,
  ifelse(issp12n$SEX==1 | issp12n$SEX==2 & issp12n$V42==3, 3, 
  ifelse(issp12n$SEX==2 & issp12n$V42==2, 4, 
  ifelse(issp12n$SEX==2 & issp12n$V42==1, 5,NA)))))
Ich mag an Deiner Version, dass die Variablen ihre Werte nicht verändern, das entspricht den Prinzipien der funktionalen Programmierung. Ansonsten solltest Du nochmal überlegen, ob Du Dir von Hufeisen nicht noch mehr abgucken könntest.

Außerdem solltest Du mal überlegen, ob es richtig ist, den Code durch copy&paste sechs mal für sechs Spalten laufen zu lassen oder ob man den Code vielleicht so umschreiben kann, dass er in einer for-Schleife 6mal aufgerufen wird. Beides nur als Vorschläge, wenn Du nicht nur lauffähigen Code schreiben, sondern noch etwas dazu lernen möchtest.

LG,
Bernhard
Hallo Bernhard,

da stimme ich Dir natürlich zu. Den Lösungsansatz von Hufeisen werde ich mir nochmals anschauen.
Wie gesagt, ich bin erst Anfänger und lerne gerne dazu. Vielen Dank für Euer Feedback!

Viele Grüße
Jörn
Antworten