2016-11-03 3 views
0

Comment puis-je transformer les données X à Y comme dansR reshape2 dcast: transformer les données

X = data.frame(
    ID = c(1,1,1,2,2), 
    NAME = c("MIKE","MIKE","MIKE","LUCY","LUCY"), 
    SEX = c("MALE","MALE","MALE","FEMALE","FEMALE"), 
    TEST = c(1,2,3,1,2), 
    SCORE = c(70,80,90,65,75) 
) 

Y = data.frame(
    ID = c(1,2), 
    NAME = c("MIKE","LUCY"), 
    SEX = c("MALE","FEMALE"), 
    TEST_1 =c(70,65), 
    TEST_2 =c(80,75), 
    TEST_3 =c(90,NA) 
) 

La fonction dcast dans reshape2 semble fonctionner, mais il ne peut pas inclure d'autres colonnes dans les données comme ID, nom et le sexe dans l'exemple ci-dessus.

En supposant que toutes les autres colonnes d'une colonne ID sont cohérentes, comme Mike ne peut être qu'un homme avec ID 1, comment pouvons-nous le faire?

+2

Qu'avez-vous essayé? Cela semble fonctionner: 'dcast (X, ID + NOM + SEX ~ TEST, value.var =" SCORE ")' –

+0

Ou utiliser 'library (tidyr); propagation (X, TEST, SCORE)' – akrun

Répondre

1

Selon la documentation (?reshape2::dcast), dcast() permet de ... dans la formule:

"..." représente toutes les autres variables non utilisées dans la formule ...

Cette est vrai pour les paquets reshape2 et data.table qui prennent en charge dcast().

Ainsi, vous pouvez écrire:

reshape2::dcast(X, ... ~ TEST, value.var = "SCORE") 
# ID NAME SEX 1 2 3 
#1 1 MIKE MALE 70 80 90 
#2 2 LUCY FEMALE 65 75 NA 

Cependant, si l'OP insiste sur le fait que les noms de colonnes doivent être TEST_1, TEST_2, etc., la colonne a besoin TEST être modifiée avant remodelant. Ici, data.table est utilisé:

library(data.table) 
dcast(setDT(X)[, TEST := paste0("TEST_", TEST)], ... ~ TEST, value.var = "SCORE") 
# ID NAME SEX TEST_1 TEST_2 TEST_3 
#1: 1 MIKE MALE  70  80  90 
#2: 2 LUCY FEMALE  65  75  NA 

qui est conforme à la réponse attendue donnée comme data.frame Y.