Seite 1 von 1

For/If Anwendung mit Filter

Verfasst: Do Apr 08, 2021 10:58 am
von gming11
Hallo Kolleginnen und Kollegen,

eine Frage bzgl. Schleifen und If-Anweisung.
Ich habe folgenden Datensatz von longitudinalen Daten:

Code: Alles auswählen

namen <- c("A", "A", "A", "A", "B", "B" , "B", "B", "C", "C")
Zeit <- c("t1", "t2", "t3", "t4", "t1", "t2", "t3", "t4", "t1", "t2") #hier fehlt z.b der Messzeitpunkt t3 und t4 für Proband C ergo die zweite Periode
Gruppe <- c(1,1,2,2,2,2,1,1,1,1) #ergo t1&t2 sind eine Periode und t3&t4 sind eine Periode
Ergebnis <- c(10,10,10,10, 10,10,10,10,10,10)
Dataframe <- data.frame(Proband= namen, Zeitpunkt= Zeit, Gruppe = Gruppe, Ergebnis = Ergebnis)
Dataframe
Nun sollte ich falls die Bedingung erfüllt ist, dass Zeit = „t2“ und (&&) Gruppe = „1“ ist, dass beim Ergebnis eine Zufallsverteilung (z.b. uniform, poisson, binomial) zwischen 1 und 3 hinzuaddiert werden sollte.
Ich habe es durch die If Anweisung und For-Schleife probiert, allerdings scheitere ich irgendwie daran, dass ich dies ja für alle Probanden (namen) machen muss und die Bedingung erfüllt sein muss.

der durch die Anweisung überschriebene Ergebnisvektor für die ersten drei Probanden sollte dann z.b. sein:

Code: Alles auswählen

Ergebnis <- c(10,12,10,10, 10,10,10,10,10,12.5)

Re: For/If Anwendung mit Filter

Verfasst: Do Apr 08, 2021 12:46 pm
von bigben
Hallo gming,

das klingt nach einer Hausaufgabe oder etwas ähnlichem. Wenn das so ist, schau bitte mal hier: viewtopic.php?f=20&t=35
gming11 hat geschrieben: Do Apr 08, 2021 10:58 amfalls die Bedingung erfüllt ist, dass Zeit = „t2“ und (&&) Gruppe = „1“ ist
Dann lass uns doch mal schauen, bei welchen Einträgen das der Fall ist. "Welchen" heißt auf Englisch "which":

Code: Alles auswählen

> which(Dataframe$Zeit =="t2" & Dataframe$Gruppe == 1)
[1]  2 10
Demnach müsste man in Zeile 2 und 10 die Bedingung erfüllt sehen:

Code: Alles auswählen

print(Dataframe[c(2, 10),])
und, stimmt's?

Kannst Du das mit dem Addieren dann selbst?
... allerdings scheitere ich irgendwie daran, dass ich dies ja für alle Probanden (namen) machen muss


Von Namen steht in der Aufgabenstellung nichts. Ggf. musst Du die Aufgabenformulierung nochmal überarbeiten?

LG,
Bernhard

Re: For/If Anwendung mit Filter

Verfasst: Do Apr 08, 2021 12:51 pm
von gming11
Hallo Bernhard,

nein es handelt sich um eine Studie. Ich habe es nur vereinfacht dargestellt, deswegen immer derselbe Datensatz :)

Aus dem „Hausaufgabenalter" bin ich zum Glück schon heraussen :)

Das mit dem which ist eine gute Idee, danke!
Allerdings wie kann ich dies nun neu überschreiben, ich sollte ja die Ergebnisse überschreiben, deswegen dachte ich eine For-Schleife wäre hier sinnvoll (in der Studie sind dann nämlich 250 Probanden und nicht nur 3 wie hier exemplarisch) und es sollte dann ja für jene, bei welchen die Bedingung zutrifft überschrieben werden mit einer Zufallszahl von 1 bis 3, welche ich vorher festsetze (sodass ich sie simulationsbasiert noch ändern kann).

Bzgl. (namen) da war der Code gemeint:

Code: Alles auswählen

namen <- c("A", "A", "A", "A", "B", "B" , "B", "B", "C", "C")
Liebe Grüße

Re: For/If Anwendung mit Filter

Verfasst: Do Apr 08, 2021 12:57 pm
von gming11
Hallo Bernhard,

ich habe meinen Fehler soeben gefunden. Mir war nicht klar, dass zwischen zwei Bedingungen nur ein „&“ stehen muss und nicht das logische und „&&“.

Danke für die Mühe

Re: For/If Anwendung mit Filter

Verfasst: Do Apr 08, 2021 1:00 pm
von bigben
Hallo!
gming11 hat geschrieben: Do Apr 08, 2021 12:51 pmAus dem „Hausaufgabenalter" bin ich zum Glück schon heraussen :)
Das sieht man Dir im Forum gar nicht an.
Allerdings wie kann ich dies nun neu überschreiben, ich sollte ja die Ergebnisse überschreiben, deswegen dachte ich eine For-Schleife wäre hier sinnvoll
Die for-Schleife macht hier nichts einfacher und nichts überschreibbarer, nur langsamer (aber auch nicht so langsam, dass es bei 150 Probanden ausbremsen würde). Natürlich sollst Du die Ausgabe von which nicht manuell, sondern programmiererisch nutzen:

Code: Alles auswählen

# wir merken uns das Ergebnis von which in einer Variablen, z. B. in 'w'
w <- which(Dataframe$Zeit =="t2" & Dataframe$Gruppe == 1)
# mit den Ergebnissen in w manipulieren wir jetzt die Ergebnisspalte
Dataframe[w, "Ergebnis"] <- 9999

Dataframe
überschrieben werden mit einer Zufallszahl von 1 bis 3, welche ich vorher festsetze


Eine Zufallszahl die Du festsetzt? Ich dachte der Witz an Zufallszahlen sei, dass Du sie eben nicht festsetzt.
Bzgl. (namen) da war der Code gemeint:

Code: Alles auswählen

namen <- c("A", "A", "A", "A", "B", "B" , "B", "B", "C", "C")
Das hab ich wohl verstanden, aber da ich diese Spalte für meinen Lösungsvorschlag nicht gebraucht habe stellt sich die Frage, ob man sie nicht braucht oder ob mein Lösungsvorschlag unpassend ist.
ich habe meinen Fehler soeben gefunden. Mir war nicht klar, dass zwischen zwei Bedingungen nur ein „&“ stehen muss und nicht das logische und „&&“.
Das ist gut, trotzdem solltest Du Dir anschauen, wie man das auch ohne for-Schleife machen kann. Irgendwann sind es nicht mehr zweihundertfünfzig sondern zweihundertfünfzigtausend und dann werden geschachtelte for-Schleifen nachteilig.

LG,
Bernhard

Re: For/If Anwendung mit Filter

Verfasst: Do Apr 08, 2021 2:38 pm
von jogo
Hallo gming,

meine Variante sieht so aus:

Code: Alles auswählen

Dataframe <- data.frame(
  Proband = c("A", "A", "A", "A", "B", "B" , "B", "B", "C", "C"),
  Zeitpunkt = c("t1", "t2", "t3", "t4", "t1", "t2", "t3", "t4", "t1", "t2"), #hier fehlt z.b der Messzeitpunkt t3 und t4 für Proband C ergo die zweite Periode
  Gruppe = c(1,1,2,2,2,2,1,1,1,1), #ergo t1&t2 sind eine Periode und t3&t4 sind eine Periode
  Ergebnis = c(10,10,10,10, 10,10,10,10,10,10))
Dataframe

i <- with(Dataframe, Zeitpunkt == "t2" & Gruppe == "1")
n <- sum(i)

Dataframe$Ergebnis2[i] <- Dataframe$Ergebnis[i] + sample.int(3, n, replace=TRUE)
Dataframe
# oder
Dataframe$Ergebnis2 <- Dataframe$Ergebnis
Dataframe$Ergebnis2[i] <- Dataframe$Ergebnis[i] + sample.int(3, n, replace=TRUE)
Dataframe
Gruß, Jörg

Re: For/If Anwendung mit Filter

Verfasst: Do Apr 08, 2021 2:49 pm
von bigben
Hallo Jörg,

ich glaube, da gehört noch ein "replace = TRUE" in das sample.int() :)

LG,
Bernhard

Re: For/If Anwendung mit Filter

Verfasst: Do Apr 08, 2021 2:51 pm
von jogo
Danke, Bernhard! Habe ich geändert.