For/If Anwendung mit Filter

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

Moderatoren: EDi, jogo

Antworten
gming11
Beiträge: 27
Registriert: Do Feb 25, 2021 10:37 am

For/If Anwendung mit Filter

Beitrag 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)
bigben
Beiträge: 2771
Registriert: Mi Okt 12, 2016 9:09 am

Re: For/If Anwendung mit Filter

Beitrag 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
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
gming11
Beiträge: 27
Registriert: Do Feb 25, 2021 10:37 am

Re: For/If Anwendung mit Filter

Beitrag 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
gming11
Beiträge: 27
Registriert: Do Feb 25, 2021 10:37 am

Re: For/If Anwendung mit Filter

Beitrag 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
bigben
Beiträge: 2771
Registriert: Mi Okt 12, 2016 9:09 am

Re: For/If Anwendung mit Filter

Beitrag 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
---
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: For/If Anwendung mit Filter

Beitrag 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
bigben
Beiträge: 2771
Registriert: Mi Okt 12, 2016 9:09 am

Re: For/If Anwendung mit Filter

Beitrag von bigben »

Hallo Jörg,

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

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: For/If Anwendung mit Filter

Beitrag von jogo »

Danke, Bernhard! Habe ich geändert.
Antworten