2017-04-30 1 views
1

J'ai un tas de trames de données qui ressemblent à ceci dans R:La combinaison et Transforming trames de données dans R

print(output[2]) 
Button Intensity Acc Intensity RT Time tdelta SubjectID CoupleID PrePost 
1:  0  30 0  0.0 0 83325.87 0.000  1531 153 Post 
2:  1  30 1  13.5 0 83362.65 36.782  1531 153 Post 
3:  1  30 1  15.0 0 83376.68 14.027  1531 153 Post 
4:  1  30 1  6.0 0 83392.27 15.585  1531 153 Post 
5:  1  30 1  15.0 0 83398.77 6.507  1531 153 Post 

print(output[1]) 
[[1]] 
    Button Intensity Acc Intensity RT  Time tdelta SubjectID CoupleID PrePost 
    1:  0  30 0  0.0 0 77987.93 0.000  1531 153 Pre 
    2:  1  30 1  13.5 0 78084.57 96.639  1531 153 Pre 
    3:  1  30 1  15.0 0 78098.62 14.054  1531 153 Pre 
    4:  1  30 1  6.0 0 78114.13 15.508  1531 153 Pre 
    5:  1  30 1  15.0 0 78120.67 6.537  1531 153 Pre 

Je veux les combiner en une seule grande trame de données qui a la logique et le format suivant:

SubjectID CoupleID PrePost Miss1RT Miss2RT Miss3RT Hit1RT Hit2RT Hit3RT 
1531 153   Post  0.00  NA  NA  NA  36.78 14.027 
1531 153   Pre  0.00  NA  NA  NA  96.638 14.054 

si Button == 0, alors c'est une Miss, si c'est == 1, alors c'est un Hit. Donc, il devrait être quelque chose comme:

for row in output[i].rows: 
    if Button ==0: 
     Miss1RT ==tdelta 
    elif Button ==1; 
     Miss1RT =='NA' 

puis une version inversée où si le bouton est 1, appuyez sur [i] RT est TDELTA ou bien 'NA'.

Il y a 26 lignes par trame de données et chaque ligne est un hit ou un miss, donc il y aura 26 colonnes Miss et 26 Hit et chaque SubjectID recevra deux lignes - une pour Pre et une pour Post. Ainsi, les en-têtes de colonne pour la sortie finale seront:

SubjectID CoupleID PrePost Miss1RT Miss2RT ...Miss26RT Hit1RT Hit2RT ... Hit26RT 

Je suis nouveau à R et aux prises avec la syntaxe appropriée.

+0

Voulez-vous qu'à regarder les deux premiers '' Hits' et-accidents? Ou voulez-vous regarder tout possible? C'est à dire. voudriez-vous un 'Hit2RT = 15.585' pour votre' Post', 'CoupleID = 153'? –

+0

Je veux Hit1-26RT et la même chose pour Miss1-26RT pour chaque Pre/Post SubjectID de sorte que chacun des 26 boutons == 1 ou 0 ligne crée un nombre soit Hit [i] RT ou Mlle [i] RT et un 'NA' dans l'autre. Edité le poste pour plus de clarté. –

+0

Donc, 'Hit1RT' devrait-il être' NA'? et puis 'Hit2RT' être' 36.78'? –

Répondre

1

Quelque chose comme cela devrait fonctionner:

#Get data in structure OP has 
output <- list(pre, post) 
output2 <- lapply(output, function(x) cbind(x, num = paste0(1:nrow(x), "RT"))) 
pre_post <- do.call("rbind", output2) 

#Perform actual calculations 
pre_post$miss <- ifelse(pre_post$Button == 0, pre_post$tdelta, NA) 
pre_post$hit <- ifelse(pre_post$Button == 1, pre_post$tdelta, NA) 

pre_post_melted <- melt(pre_post, id.vars = c("SubjectID", "CoupleID", "num", "PrePost"), measure.vars = c("hit","miss")) 
pre_post_res <- dcast(pre_post_melted, SubjectID + CoupleID + PrePost ~ variable + num, sep = "") 

pre_post_res 

    #SubjectID CoupleID PrePost hit_1RT hit_2RT hit_3RT hit_4RT hit_5RT miss_1RT miss_2RT miss_3RT miss_4RT miss_5RT 
#1  1531  153 Post  NA 36.782 14.027 15.585 6.507  0  NA  NA  NA  NA 
#2  1531  153  Pre  NA 96.639 14.054 15.508 6.537  0  NA  NA  NA  NA 

Nous transposons les données pour créer dynamiquement toutes les variables que nous voulons. Nous empilons également les données pour éviter les étapes répétées.


données:

pre <- structure(list(Button = c(0L, 1L, 1L, 1L, 1L), Intensity = c(30L, 
30L, 30L, 30L, 30L), Acc = c(0L, 1L, 1L, 1L, 1L), Intensity = c(0, 
13.5, 15, 6, 15), RT = c(0L, 0L, 0L, 0L, 0L), Time = c(77987.93, 
78084.57, 78098.62, 78114.13, 78120.67), tdelta = c(0, 96.639, 
14.054, 15.508, 6.537), SubjectID = c(1531L, 1531L, 1531L, 1531L, 
1531L), CoupleID = c(153L, 153L, 153L, 153L, 153L), PrePost = c("Pre", 
"Pre", "Pre", "Pre", "Pre")), .Names = c("Button", "Intensity", 
"Acc", "Intensity", "RT", "Time", "tdelta", "SubjectID", "CoupleID", 
"PrePost"), row.names = c(NA, -5L), class = "data.frame") 

post <- structure(list(Button = c(0L, 1L, 1L, 1L, 1L), Intensity = c(30L, 
30L, 30L, 30L, 30L), Acc = c(0L, 1L, 1L, 1L, 1L), Intensity = c(0, 
13.5, 15, 6, 15), RT = c(0L, 0L, 0L, 0L, 0L), Time = c(83325.87, 
83362.65, 83376.68, 83392.27, 83398.77), tdelta = c(0, 36.782, 
14.027, 15.585, 6.507), SubjectID = c(1531L, 1531L, 1531L, 1531L, 
1531L), CoupleID = c(153L, 153L, 153L, 153L, 153L), PrePost = c("Post", 
"Post", "Post", "Post", "Post")), .Names = c("Button", "Intensity", 
"Acc", "Intensity", "RT", "Time", "tdelta", "SubjectID", "CoupleID", 
"PrePost"), row.names = c(NA, -5L), class = "data.frame") 
+0

Il semble que la première étape consiste à combiner une "pré" et une "post" liste de trames de données, mais ils sont tous juste dans une liste de trames de données, "sortie". Quand j'ai essayé 'sortie miss

+0

@HeatherCohen C'est parce que cela ressemble à 'output' est une liste. Essayez d'empiler 'output $ pre' et' output $ post' –

+0

Ou dans votre pile de pile 'output [[1]]' et 'output [[2]]' –