neue Variable mit IF ELSE

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

Moderatoren: EDi, jogo

Antworten
maffi
Beiträge: 2
Registriert: Mo Mai 16, 2022 6:14 pm

neue Variable mit IF ELSE

Beitrag von maffi »

Hallo,

vorab: ich bin ein ziemlicher Neuling in R und versuche derzeit aus einem Datensatz die Variablen zu bilden.
Nach einer erfolgreichen Faktorenanalyse habe ich etliche Items, aus denen ich die Produktsumme bilde.
Die Skala reicht von 1 bis 5 und hier genau entsteht das Problem. Wenn ich die Produktsumme bilde, reicht die Skala bis 225. Das ist für die spätere Analyse ungünstig.
Daher hatte ich folgenden Code generiert, aber irgendwie klappt das nicht so ganz und ich weiß nun echt nicht mehr weiter.

Zuerst habe ich das probiert:
Idee 1:
Zuerst die Produktsumme gebildet

Code: Alles auswählen

daten_sclean$physindex2 <- as.factor((daten_sclean$incphys_2a * daten_sclean$incphys_3a)
                                           + (daten_sclean$incphys_2b * daten_sclean$incphys_3b) 
                                           + (daten_sclean$incphys_2c * daten_sclean$incphys_3c) 
                                           + (daten_sclean$incphys_2d * daten_sclean$incphys_3d) 
                                           + (daten_sclean$incphys_2e * daten_sclean$incphys_3e) 
                                           + (daten_sclean$incphys_2f * daten_sclean$incphys_3f) 
                                           + (daten_sclean$incphys_2g * daten_sclean$incphys_3g) 
                                           + (daten_sclean$incphys_2h * daten_sclean$incphys_3h) 
                                           + (daten_sclean$incphys_2i * daten_sclean$incphys_3i)) 
und wollte dann die Skalen neu bilden

Code: Alles auswählen

daten_sclean$physindex22 <- as.factor(ifelse(daten_sclean$physindex2 <= 225, 5, 
                                         ifelse(daten_sclean$physindex2 <= 180, 4),
                                         ifelse(daten_sclean$physindex2 <= 135, 3),
                                         ifelse(daten_sclean$physindex2 <= 90, 2),
                                         ifelse(daten_sclean$physindex2 <= 45, 1, 0)))

-----
leider error..
Error in ifelse(daten_sclean$physindex <= 225, 5, ifelse(daten_sclean$physindex <= :
unused arguments (ifelse(daten_sclean$physindex <= 135, 3), ifelse(daten_sclean$physindex <= 90, 2), ifelse(daten_sclean$physindex <= 45, 1, 0))


----
so ging es leider auch nicht
-------------
dritte Variante, wollte ich folgendes ausprobieren:

Code: Alles auswählen

daten_sclean$physindexnum3 <- ifelse(daten_sclean$physindex2 <=45, 1, ifelse(daten_sclean$physindex2 <=90, 2, 
                                                                           daten_sclean$physindex2 <=135, 3,
                                                                           daten_sclean$physindex2 <=180, 4, 5)) %>%
  ordered(levels = c("1", "2", "3", "4", "5"))
Warning message:
In Ops.factor(daten_sclean$physindex2, 45) :
‘<=’ ist nicht sinnvoll für Faktoren



---------------------
dann habe ich es noch so probiert. Skala reichte bis 225, bin dann schrittweise runter gegangen

Code: Alles auswählen

daten_sclean$physindex <- as.factor(ifelse((daten_sclean$incphys_2a * daten_sclean$incphys_3a)
                        + (daten_sclean$incphys_2b * daten_sclean$incphys_3b) 
                        + (daten_sclean$incphys_2c * daten_sclean$incphys_3c) 
                        + (daten_sclean$incphys_2d * daten_sclean$incphys_3d) 
                        + (daten_sclean$incphys_2e * daten_sclean$incphys_3e) 
                        + (daten_sclean$incphys_2f * daten_sclean$incphys_3f) 
                        + (daten_sclean$incphys_2g * daten_sclean$incphys_3g) 
                        + (daten_sclean$incphys_2h * daten_sclean$incphys_3h) 
                        + (daten_sclean$incphys_2i * daten_sclean$incphys_3i) <=225, 5, 
                        (ifelse((daten_sclean$incphys_2a * daten_sclean$incphys_3a)
                                + (daten_sclean$incphys_2b * daten_sclean$incphys_3b) 
                                + (daten_sclean$incphys_2c * daten_sclean$incphys_3c) 
                                + (daten_sclean$incphys_2d * daten_sclean$incphys_3d) 
                                + (daten_sclean$incphys_2e * daten_sclean$incphys_3e) 
                                + (daten_sclean$incphys_2f * daten_sclean$incphys_3f) 
                                + (daten_sclean$incphys_2g * daten_sclean$incphys_3g) 
                                + (daten_sclean$incphys_2h * daten_sclean$incphys_3h) 
                                + (daten_sclean$incphys_2i * daten_sclean$incphys_3i) <=180, 4,
                                (ifelse((daten_sclean$incphys_2a * daten_sclean$incphys_3a)
                                        + (daten_sclean$incphys_2b * daten_sclean$incphys_3b) 
                                        + (daten_sclean$incphys_2c * daten_sclean$incphys_3c) 
                                        + (daten_sclean$incphys_2d * daten_sclean$incphys_3d) 
                                        + (daten_sclean$incphys_2e * daten_sclean$incphys_3e) 
                                        + (daten_sclean$incphys_2f * daten_sclean$incphys_3f) 
                                        + (daten_sclean$incphys_2g * daten_sclean$incphys_3g) 
                                        + (daten_sclean$incphys_2h * daten_sclean$incphys_3h) 
                                        + (daten_sclean$incphys_2i * daten_sclean$incphys_3i) <=135, 3,
                                        (ifelse((daten_sclean$incphys_2a * daten_sclean$incphys_3a)
                                                + (daten_sclean$incphys_2b * daten_sclean$incphys_3b) 
                                                + (daten_sclean$incphys_2c * daten_sclean$incphys_3c) 
                                                + (daten_sclean$incphys_2d * daten_sclean$incphys_3d) 
                                                + (daten_sclean$incphys_2e * daten_sclean$incphys_3e) 
                                                + (daten_sclean$incphys_2f * daten_sclean$incphys_3f) 
                                                + (daten_sclean$incphys_2g * daten_sclean$incphys_3g) 
                                                + (daten_sclean$incphys_2h * daten_sclean$incphys_3h) 
                                                + (daten_sclean$incphys_2i * daten_sclean$incphys_3i) <=90, 2, 
                                                (ifelse((daten_sclean$incphys_2a * daten_sclean$incphys_3a)
                                                        + (daten_sclean$incphys_2b * daten_sclean$incphys_3b) 
                                                        + (daten_sclean$incphys_2c * daten_sclean$incphys_3c) 
                                                        + (daten_sclean$incphys_2d * daten_sclean$incphys_3d) 
                                                        + (daten_sclean$incphys_2e * daten_sclean$incphys_3e) 
                                                        + (daten_sclean$incphys_2f * daten_sclean$incphys_3f) 
                                                        + (daten_sclean$incphys_2g * daten_sclean$incphys_3g) 
                                                        + (daten_sclean$incphys_2h * daten_sclean$incphys_3h) 
                                                        + (daten_sclean$incphys_2i * daten_sclean$incphys_3i) <=45, 1,0
                                                              ))))))))))
Ergebnis:
5
2182


-------------------------------------------------------------------------------
Ich wäre so dankbar, wenn mir jemand hierzu weiterhelfen kann :cry:

LG Maffi
bigben
Beiträge: 2771
Registriert: Mi Okt 12, 2016 9:09 am

Re: neue Variable mit IF ELSE

Beitrag von bigben »

Hallo Maffi,
Was ist denn das Problem mit einer Itemsumme bis 255? Warum willst Du die Information darin verwerfen?

Wenn Du das wirklich willst, dann ist ifelse die falsche Option. Schau mal cut und case_when an: viewtopic.php?t=2162

LG,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: neue Variable mit IF ELSE

Beitrag von jogo »

Hallo maffi,

willkommen im Forum!
maffi hat geschrieben: Mo Mai 16, 2022 6:42 pm vorab: ich bin ein ziemlicher Neuling in R und versuche derzeit aus einem Datensatz die Variablen zu bilden.
Nach einer erfolgreichen Faktorenanalyse habe ich etliche Items, aus denen ich die Produktsumme bilde.
Die Skala reicht von 1 bis 5 und hier genau entsteht das Problem. Wenn ich die Produktsumme bilde, reicht die Skala bis 225. Das ist für die spätere Analyse ungünstig.
Daher hatte ich folgenden Code generiert, aber irgendwie klappt das nicht so ganz und ich weiß nun echt nicht mehr weiter.

Zuerst habe ich das probiert:
Idee 1:
Zuerst die Produktsumme gebildet

Code: Alles auswählen

daten_sclean$physindex2 <- as.factor((daten_sclean$incphys_2a * daten_sclean$incphys_3a)
                                           + (daten_sclean$incphys_2b * daten_sclean$incphys_3b) 
                                           + (daten_sclean$incphys_2c * daten_sclean$incphys_3c) 
                                           + (daten_sclean$incphys_2d * daten_sclean$incphys_3d) 
                                           + (daten_sclean$incphys_2e * daten_sclean$incphys_3e) 
                                           + (daten_sclean$incphys_2f * daten_sclean$incphys_3f) 
                                           + (daten_sclean$incphys_2g * daten_sclean$incphys_3g) 
                                           + (daten_sclean$incphys_2h * daten_sclean$incphys_3h) 
                                           + (daten_sclean$incphys_2i * daten_sclean$incphys_3i)) 
und wollte dann die Skalen neu bilden

Code: Alles auswählen

daten_sclean$physindex22 <- as.factor(ifelse(daten_sclean$physindex2 <= 225, 5, 
                                         ifelse(daten_sclean$physindex2 <= 180, 4),
                                         ifelse(daten_sclean$physindex2 <= 135, 3),
                                         ifelse(daten_sclean$physindex2 <= 90, 2),
                                         ifelse(daten_sclean$physindex2 <= 45, 1, 0)))

-----
leider error..
Error in ifelse(daten_sclean$physindex <= 225, 5, ifelse(daten_sclean$physindex <= :
unused arguments (ifelse(daten_sclean$physindex <= 135, 3), ifelse(daten_sclean$physindex <= 90, 2), ifelse(daten_sclean$physindex <= 45, 1, 0))
Die Funktion ifelse() erwartet drei Argumente. Deshalb müsste es so aussehen:

Code: Alles auswählen

ifelse(..., ..., ifelse(..., ..., ifelse(...)))
Das ist aber alles sehr umständlich. Bitte schaue Dir die Funktion cut() an, die macht genau das, was Du willst.
Und solltest Du zukünftig irgendwo gehäuft daten_sclean$... schreiben müssen, denke bitte an die tollen Funktion with(), within() und transform().

Gruß, Jörg
maffi
Beiträge: 2
Registriert: Mo Mai 16, 2022 6:14 pm

Re: neue Variable mit IF ELSE

Beitrag von maffi »

ein verspätetes DANKE mit den Hinweisen!
Das hat ungemein geholfen.

Für mich jetzt noch etwas umständlich mit der Interpretation, da durch CUT immer direkt kategoriale Variablen im Regressionmodel ausgespuckt werden und somit nicht nur etwas länger sondern auch umfangreicher wird mit der Interpretation.

Wie kann ich das verhindern? Ich möchte letzten Endes für jeden Prädiktor nur eine Zeile stehen haben..Bin da noch etwas ratlos. :?
bigben
Beiträge: 2771
Registriert: Mi Okt 12, 2016 9:09 am

Re: neue Variable mit IF ELSE

Beitrag von bigben »

Hallo maffi,

wenn ich es recht verstehe, dann willst Du aus dem ordinalen Skalenniveau ein metrisches machen. Denk gut darüber nach, ob das in Deinem Kontext angemessen ist. Programmieren kannst Du das einfach mit as.numeric oder as.integer.

Beispiel:

Code: Alles auswählen

index <- c(250, 200, 150, 100, 50, 10, sample.int(300, 100))
vereinfacht <- cut(index, breaks = c(-1, 45, 90, 135, 180, 225, Inf), 
                   include.lowest = FALSE, ordered_result = TRUE)
vereinfacht              # das ist ein ordered factor
as.integer(vereinfacht)  # das sind jetzt Zahlenwerte
summary(lm(index ~ as.integer(vereinfacht))) # mit den Zahlenwerten ein lm gerechnet
plot(index, as.integer(vereinfacht))
LG,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: neue Variable mit IF ELSE

Beitrag von jogo »

Hallo maffi,

für einfachere Bezeichnungen der Intervalle kennt die Funktion cut() den Parameter labels= . Ansonsten gilt das von Bernhard Geschriebene -- bei einer Umwandlung eines ordinal skalierten Merkmals in ein kardinal skaliertes Merkmals muss man vorsichtig sein -- das ist nicht natürlicherweise gegeben.
Das sollte man gründlich überlegen.

Gruß, Jörg
Antworten