In einer Schleifen Vektor in Datensatz einfügen

Allgemeine Fragen zur Programmierung mit R.

In einer Schleifen Vektor in Datensatz einfügen

Beitragvon lumifex » Mi 15. Aug 2018, 11:57

Hallo,

ich tüfftel jetzt seit 2 Tagen daran, bekomme es aber selber nicht hin und ich finde auch nichts im Internet, ich hoffe hier kann mir einer Helfen.

Ich habe eine Funktion mit einer Schleife erstellt, die funktioniert auch soweit. Ich möchte jetzt mehrere dataframes dadurchschicken. Soweit bin ich aber noch nicht ^^'. (Geht das am besten mit lapply oder kann man das auch als Schleife machen??)
Was mein eigentliches Problem ist, dass den Vektor, den ich aus dem Datensatz erstellt habe, den ich mit der Schleife erstelle, in den Datensatz einfügen möchte (mit cbind). Das funktioniert aber nicht und ich bekomme irgendeine Fehlermeldung, je nachdem was ich verändere...
Kann mir irgendwer sagen, wie das funktioniert oder was ich falsche gemacht habe?

Code: Alles auswählen
AuWM2_lsd <- function(a) {
  FQ<-data.frame(Fehler=c(rep(NA, 672)))
  for (i in 1:672) {
  }
    if(a[,4][i] == a[,5][i]) { #Zieltier = l.aussen
     if(a[,9][i]=="R"){ #richtige Taste gedrückt?
        FQ[,1] <<- 1 #richtige Taste
      } else {
        FQ[,1] <<- 4 #falsche Taste
     }
    } else if (a[,4][i] == a[,6][i]) { #Zieltier = l.innen
      if(a[,9][i]=="R"){ #richtige Taste?
        FQ[,1] <<- 1 # richtige Taste
      } else {
        FQ[,1] <<- 4 # falsche Taste
      }
    } else if (a[,4][i] == a[,7][i]) { #Zieltier = r.innen
      if(a[,9][i]=="T3"){
        FQ[,1] <<- 1
      } else {
        FQ[,1] <<- 4
      } 
    } else if (a[,4][i] == a[,8][i]) { #Zielttier r.aussen
      if(a[,9][i]=="T3"){
        FQ[,1] <<- 1
      } else {
        FQ[,1] <<- 4
      }
    } else { # Zieltier war nichtdrin
      if(a[,9][i]==""){ #nichts gedrückt?
        FQ[,1] <<- 1 #nichts gedrückt
      } else {
        FQ[,1] <<- 0 #irgendeine Taste gedrückt
      }
    }
      a[i]<<-cbind(a[i], FQ)
  }


Die Fehlermeldung, wenn ich einen Datensatz dadurch schicke, ist
Error in `[.data.frame`(a, i) : undefined columns selected
Called from: `[.data.frame`(a, i)
lumifex
 
Beiträge: 9
Registriert: Di 14. Aug 2018, 15:43
Danke gegeben: 0
Danke bekommen: 0 mal in 0 Post

Re: In einer Schleifen Vektor in Datensatz einfügen

Beitragvon jogo » Mi 15. Aug 2018, 13:12

Hallo lumifex,

das wird eine harte Arbeit für mich, wenn ich mich durch diese Funktion durcharbeiten will.
Warum schreibst Du eine Funktion, wenn Du so viele globale Zuweisungen verwendest?
Was willst Du als Ergebnis zurück geben? .. den Dataframe FQ? oder noch etwas anderes?

Lesestoff: https://www.burns-stat.com/pages/Tutor/R_inferno.pdf , Circle 6

Vielleicht kannst Du Deine Funktion nochmal überarbeiten, wenn Du die Funktion ifelse() gennengelernt hast.
Nachtrag:
nachdem ich mir die Struktur der Funktion etwas angesehen habe, bin ich mir nicht mehr sicher, ob ifelse() (und damit Vektorisierung) günstig ist.

Du musst sogar Deine Funktion überarbeiten, schau:
Code: Alles auswählen
  for (i in 1:672) { 
  } 

Dies ist eine Schleife, die nichts macht. Das hast Du bestimmt so nicht gewollt. :shock:

a[,4][i] ist identisch mit a[i, 4]

Was passiert eigentlich, wenn a[i,4]==a[i,5] und a[i,4]==a[i,7] :?:

Lohnt es sich, die Entscheidungsstruktur umzukehren, z.B. erst a[i, 9] testen oder ergebnisorientier zu arbeiten (unter welchen Bedingungen soll 1, 4 oder 0 eingetragen werden)?
Kannst Du bitte den Output von
Code: Alles auswählen
str(a)
zeigen?

Gruß, Jörg
üblicherweise bin ich öfter in jenem Forum: http://forum.r-statistik.de
jogo
 
Beiträge: 204
Registriert: Mo 26. Feb 2018, 09:56
Danke gegeben: 3
Danke bekommen: 1 mal in 1 Post

Re: In einer Schleifen Vektor in Datensatz einfügen

Beitragvon lumifex » Mi 15. Aug 2018, 14:28

Hallo Jörg,
i soll die Zeilen des dataframes darstellen. Der Datensatz hat insgesamt 672 Zeilen und es soll immer für jede Spalte das Folgende gemacht werden.

ich möchte in meinem Datensatz gucken, ob die 4.Spalte mit der 5., 6., 7 oder der 8. Spalte übereinstimmt, dann soll geguckt werden, ob in Spalte 9 R bzw T3 steht, wenn das der Fall ist, soll in den Vektor FQ eine 1 geschrieben werden, wenn nicht eine 4. Sollte in Spalte 9 nichts sein, soll eine 0 in FQ geschrieben werden. Wenn die 4. Spalte nicht mit Spalte 5-8 übereinstimmt, muss geguckt werden, ob etwas in Spalte 9 steht. Wenn nichts in 9 steht, kommt eine 1 rein, wenn doch was gedrückt wurden dann eine 0.
Also nein, umdrehen bringt meiner Meinung nach nichts.
Diesen Vektor FQ, den ich ja vorher erstellt habe, soll dann an den Datensatz gehangen werden. Das ganze soll nachtürlich gespeichert werden. Diese ganze Ding, möchte ich für insgesamt 16 Daten durchlaufen lassen.

Der Output von str ist (a ist ja von der Funktion...^^)
Code: Alles auswählen
> str(VP02_lsd)
'data.frame':   672 obs. of  11 variables:
$ V1        : int  1 2 3 4 5 6 7 8 9 10 ...
$ V2        : int  1 2 3 4 5 6 7 8 9 10 ...
$ V3        : int  9 9 9 9 9 9 9 9 9 9 ...
$ Zieltier  : chr  "h" "d" "c" "h" ...
$ l.aussen  : chr  "g" "h" "s" "d" ...
$ l.innen   : chr  "s" "f" "h" "b" ...
$ r.innen   : chr  "c" "b" "s" "a" ...
$ r.aussen  : chr  "s" "d" "c" "e" ...
$ Antw.Taste: chr  "" "T3" "T3" "" ...
$ RT        : chr  "" "2803" "2757" "" ...
$ Fehler    : num  1 1 1 1 1 1 1 1 1 1 ...
lumifex
 
Beiträge: 9
Registriert: Di 14. Aug 2018, 15:43
Danke gegeben: 0
Danke bekommen: 0 mal in 0 Post

Re: In einer Schleifen Vektor in Datensatz einfügen

Beitragvon jogo » Mi 15. Aug 2018, 14:56

Dann schlage ich folgendes vor:
Code: Alles auswählen
AuWM2_lsd <- function(ai) {
    if (ai["Zieltier"]==ai["l.aussen"]) if (ai["Antw.Taste"]=="R") return(1) else return(4)
    if (ai["Zieltier"]==ai["l.innen"]) if (ai["Antw.Taste"]=="R") return(1) else return(4)
    if (ai["Zieltier"]==ai["r.innen"]) if (ai["Antw.Taste"]=="T3") return(1) else return(4)
    if (ai["Zieltier"]==ai["r.aussen"]) if (ai["Antw.Taste"]=="T3") return(1) else return(4)
    if (ai["Antw.Taste"]=="") return(1) else return(0)
}
VP02_lsd$FQ <- apply(as.matrix(VP02_lsd), 1, AuWM2_lsd)

Vielleicht ist as.matrix() gar nicht nötig, also einfach VP02_lsd$FQ <- apply(VP02_lsd, 1, AuWM2_lsd)

Gruß, Jörg
Zuletzt geändert von jogo am Mi 15. Aug 2018, 16:05, insgesamt 3-mal geändert.
üblicherweise bin ich öfter in jenem Forum: http://forum.r-statistik.de
jogo
 
Beiträge: 204
Registriert: Mo 26. Feb 2018, 09:56
Danke gegeben: 3
Danke bekommen: 1 mal in 1 Post

Re: In einer Schleifen Vektor in Datensatz einfügen

Beitragvon lumifex » Mi 15. Aug 2018, 15:17

Super, danke!! Das ist viiel einfach als meine ^^'
Mein Frage wäre noch, da ich nichts darüber irgendwo gefunden habe, wie bzw ob es geht, dass ich quasi eine Schleife oder ähnliches mache, damit ich mehrere Dateien in einem Durchlauf mache. Oder muss ich alle einzeln durchlaufen lassen?
lumifex
 
Beiträge: 9
Registriert: Di 14. Aug 2018, 15:43
Danke gegeben: 0
Danke bekommen: 0 mal in 0 Post

Re: In einer Schleifen Vektor in Datensatz einfügen

Beitragvon jogo » Mi 15. Aug 2018, 15:30

Du hast die Dateinamen der einzulesenden Dateien?
Du weißt, wie eine solche Datei verarbeitet werden soll?

Den Rest kann man mit lapply() erledigen.
https://stackoverflow.com/questions/114 ... les-into-r
(ich würde nicht unbedingt alles 1:1 so machen, wie es dort beschrieben wird - da ist viel Beiwerk)

Gruß, Jörg
üblicherweise bin ich öfter in jenem Forum: http://forum.r-statistik.de
jogo
 
Beiträge: 204
Registriert: Mo 26. Feb 2018, 09:56
Danke gegeben: 3
Danke bekommen: 1 mal in 1 Post

Re: In einer Schleifen Vektor in Datensatz einfügen

Beitragvon grawhill » Mo 3. Sep 2018, 08:17

Thank you!
grawhill
 
Beiträge: 9
Registriert: Do 1. Jun 2017, 13:16
Danke gegeben: 0
Danke bekommen: 0 mal in 0 Post


Zurück zu Programmierung allgemein

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 0 Gäste

cron