Reshape from long to wide mit sehr komplexen Datensatz

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

Moderatoren: EDi, jogo

juppi
Beiträge: 19
Registriert: Di Mär 13, 2018 3:55 pm

Reshape from long to wide mit sehr komplexen Datensatz

Beitrag von juppi »

Hallo liebe Community,

ich habe einen sehr großen Datensatz in einem langen Format und habe den ersten Probanden mit dput unten angehängt. Die Variablen Namen des bestehenede langen Formates lauten: Items, cueLocX, cueLocY, description, stimResp, .thisRepN, .thisTrialN, .thisN, .thisIndex, RatingScale, trialType, resp, rt, corrResp, correct, streekDum, fixation1Time, participant, responseTime, cueTime, dateStr, streekSize.

Diesen Datensatz würde ich gerne in von einem langen in ein breites Format bringen, sodass jeder Participant eine Zeile belegt. Aus der Variable Items, soll aus jedem Item eine Variable entstehen und das in ABHÄNGIGKEIT von der Variable "trialType". Die Variable "trialType" gibt die unterschiedlichen Durchläufe des Versuches an. Aus der Variable "correct" soll eine Variable "Anzahl_richtige"enstehen, indem eine Summe von der Dummikodierung gebildet werden soll.

Gehts so etwas überhaupt mit reshape?

Wäre wirklich nett wenn mir jemand diese Frage beantworten könnte oder mir einen Weg aufzeigen kann :)
Zuletzt geändert von juppi am Mo Mai 28, 2018 3:58 pm, insgesamt 2-mal geändert.
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: Reshape from long to wide mit sehr komplexen Datensatz

Beitrag von jogo »

Hallo juppi,

leider habe ich nicht verstanden, wie das Ergebnis aussehen soll.
Auch frage ich mich, ob man eine solche Datenwühlerei überhaupt machen sollte - das hängt wesentlich davon ab, was man wie auswerten möchte. Vom Gefühl er würde ich sagen, wenn es keinen extremen Zwang gibt, die Daten umzuformen, sollte man sie so lassen.
Weiterhin ist mir aufgefallen, dass die verschiedenen Werte von $trialType verschieden häufig vorkommen.

Code: Alles auswählen

table(dat.all.Teila$trialType)
Eventuell handelst Du Dir hierdurch noch methodische Schwierigkeiten ein (Stichwort Heteroskedastizität).

Gruß, Jörg
juppi
Beiträge: 19
Registriert: Di Mär 13, 2018 3:55 pm

Re: Reshape from long to wide mit sehr komplexen Datensatz

Beitrag von juppi »

Vielen Dank für Deine Antwort. Das es etwas schwierig ist genau zu erklären welche Variablen ich erstellen möchte. Habe ich mal ein vereinfachtes Beispiel erstellt. Folgende Variablen sollen entstehen "Person" als idvar und der Rest in Abhängigkeit von Country und Time. Das heißt vier weitere Variablen "France_Sept", "France_Okt", "UK_Sept", "UK-Okt".

Code: Alles auswählen

install.packages("reshape")
require(reshape)
datas1 <- data.frame(Person=c("Mike","Mike","Bob","Bob"), Country=c("France","UK","France","UK"), 
                     Time=c("Sept", "Okt", "Sept","Okt"), Spent=c(1213, 1872, 1726, 2234))
datas1
s1 <- cast(datas, Person~Country+Time, value="Spent")
#Dieser Befehl funktioniert nicht -> Country+Time nicht möglich
Ohne den Datensatz umzformen werden meine Berechnungen leider schwer und ich muss das machen :(

Vielen Dank für Eure Hilfe :)
Zuletzt geändert von jogo am Mo Mai 28, 2018 8:55 am, insgesamt 1-mal geändert.
Grund: Formatierung verbessert.
Athomas
Beiträge: 768
Registriert: Mo Feb 26, 2018 8:19 pm

Re: Reshape from long to wide mit sehr komplexen Datensatz

Beitrag von Athomas »

Was funktioniert nicht?

Bei mir erzeugt

Code: Alles auswählen

library(reshape)
data.long <- data.frame(Person=c("Mike","Mike","Bob","Bob"), Country=c("France","UK","France","UK"),
                     Time=c("Sept", "Okt", "Sept","Okt"), Spent=c(1213, 1872, 1726, 2234))
data.long
data.wide <- cast(data.long, Person ~ Country + Time, value="Spent")
data.wide
folgende Datei:

Code: Alles auswählen

  Person France_Sept UK_Okt
1    Bob        1726   2234
2   Mike        1213   1872
Das passt doch!?
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: Reshape from long to wide mit sehr komplexen Datensatz

Beitrag von jogo »

oder mit data.table:

Code: Alles auswählen

library("data.table")
datas1 <- data.table(Person=c("Mike","Mike","Bob","Bob"), Country=c("France","UK","France","UK"), 
                     Time=c("Sept", "Okt", "Sept","Okt"), Spent=c(1213, 1872, 1726, 2234))
datas1
dcast(datas1, Person ~ Country + Time, value.var = "Spent")
Gruß, Jörg
juppi
Beiträge: 19
Registriert: Di Mär 13, 2018 3:55 pm

Re: Reshape from long to wide mit sehr komplexen Datensatz

Beitrag von juppi »

Super vielen Dank! Das hat mir wirklich geholfen!! Ich konnte die Erkenntnisse direkt auf meinen großen Datensatz anwenden. Jetzt habe ich noch ein letztes Problem, dass ich mit einer Erweiterung des vereinfachten Beispiels darstellen möchte. Ich habe folgenden Datensatz:

Code: Alles auswählen

datas2 <- data.frame(Person=c("Mike","Mike","Bob","Bob"), Country=c("France","UK","France","UK"), 
                    Spent=c(1213, 1872, 1726, 2234), correct=c(1,1,1,0))
datas2

datas2_wide_score <- cast(datas2, Person~correct, value="correct", fun.aggregate = sum, drop="Country") 
Diesen möchte ich in ein breites Format reshapen, dass eine Variable "Anzahl_richtige" entsteht, welche die Summe der bisherigen Variable "correct" ausgibt! Leider funktioniert mein Befehl wieder nicht... :(
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: Reshape from long to wide mit sehr komplexen Datensatz

Beitrag von jogo »

Du meinst jetzt aber nicht dies:

Code: Alles auswählen

datas2 <- data.frame(Person=c("Mike","Mike","Bob","Bob"), Country=c("France","UK","France","UK"), 
                     Spent=c(1213, 1872, 1726, 2234), correct=c(1,1,1,0))
datas2$Anzahl_richtige <- cumsum(datas2$correct)
datas2
:?:
Bitte zeige uns doch, wie das Ergebnis aussehen soll!

Gruß, Jörg
juppi
Beiträge: 19
Registriert: Di Mär 13, 2018 3:55 pm

Re: Reshape from long to wide mit sehr komplexen Datensatz

Beitrag von juppi »

Hm nein, bei meinem riesen Datensatz wird das evtl. dann nicht mehr auf die richtigen VP passen. Am besten wäre natürlich wenn ich mit einem Befehl diesen Datensatz bekommen würde:

Code: Alles auswählen

  Person France_Sept UK_Okt Anzahl_richtige
1    Bob        1726   2234  2
2   Mike        1213   1872  1
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: Reshape from long to wide mit sehr komplexen Datensatz

Beitrag von jogo »

o.k., das lässt sich mit einem Einzeiler erledigen:

Code: Alles auswählen

library("data.table")
datas1 <- data.table(Person=c("Mike","Mike","Bob","Bob"), Country=c("France","UK","France","UK"), 
                     Time=c("Sept", "Okt", "Sept","Okt"), Spent=c(1213, 1872, 1726, 2234), correct=c(1,1,1,0))
datas1
dcast(datas1, Person ~ Country + Time, value.var = "Spent")[datas1[, .(correct=sum(correct)), Person], on="Person"]
Gruß, Jörg
juppi
Beiträge: 19
Registriert: Di Mär 13, 2018 3:55 pm

Re: Reshape from long to wide mit sehr komplexen Datensatz

Beitrag von juppi »

Da kommt leider eine Fehlermeldung :(

Code: Alles auswählen

> datas3 <- data.frame(Person=c("Mike","Mike","Bob","Bob"), Country=c("France","UK","France","UK"), 
+                      Time=c("Sept", "Okt", "Sept","Okt"), Spent=c(1213, 1872, 1726, 2234), correct=c(1,1,1,0))
> datas3
  Person Country Time Spent correct
1   Mike  France Sept  1213       1
2   Mike      UK  Okt  1872       1
3    Bob  France Sept  1726       1
4    Bob      UK  Okt  2234       0
> dcast(datas3, Person ~ Country + Time, value.var = "Spent")[datas1[, .(correct=sum(correct)), Person], on="Person"]
Error in `[.data.frame`(dcast(datas3, Person ~ Country + Time, value.var = "Spent"),  : 
  unused argument (on = "Person")
Antworten