2017-06-30 1 views
1

Je voudrais convertir cette trame de donnéesvariables d'appel à la fonction définie par l'utilisateur avec reshape2 :: fondre et reshape2 :: dcast

data <- data.frame(color=c("red","red","red","green","green","green","blue","blue","blue"),object=c("box","chair","table","box","chair","table","box","chair","table"),units=c(1:9),price=c(11.5,12.5,13.5,14.5,15.5,16.5,17.5,18.5,19.5)) 

à cette autre

output <- data.frame(color=c("red","green","blue"),units_box=c(1,4,7),price_box=c(11.5,14.5,17.5), units_chair=c(2,5,8),price_chair=c(12.5,15.5,18.5),units_table=c(3,6,9),price_table=c(13.5,16.5,19.5)) 

Par conséquent, je suis en utilisant reshape2::melt et reshape2::dcast pour construire une fonction définie par l'utilisateur comme suit

fun<-function(df,var,group){ 
    r<-reshape2::melt(df,id.vars=var) 
    r<-reshape2::dcast(r,var~group) 
return(r) 
} 

Lors de l'utilisation de la fonction comme suit

amusant (données, couleur, objet)

Je reçois le message d'erreur suivant

Erreur dans melt_check (données, id.vars, measure.vars, variable.name, valeur.name): objet 'couleur' ​​pas trouvé

Savez-vous comment puis-je le résoudre? Je pense que le problème est que je devrais appeler les variables dans reshape2::melt avec des guillemets mais je ne sais pas comment.

Note 1: Je voudrais garder le format numérique d'origine de variables (c.-à-objets sans décimales et prix avec une décimale)

Note 2: Je voudrais faire remarquer que que mon code réel (ce qui est juste exemple simplifié) est beaucoup plus long et implique des fonctions dplyr (y compris les fonctions enquo() et UQ()). Par conséquent, les solutions pour ce cas devraient être compatibles avec dplyr.

Note 3: Je n'utilise pas tidyr (je suis un grand amusement de tout le tidyverse) parce que le utilise toujours l'ancien langage pour les fonctions et je partage le script avec d'autres personnes qui pourraient ne pas vouloir utiliser le version de développement de tidyr.

Répondre

0

Je résolu la question par moi-même (bien que je ne sais pas très bien les raisons). Le principal problème, comme je le soupçonnais, était de passer les variables de la fonction définie par l'utilisateur dans fonte et dcast provoquer une sorte de conflit peut-être en raison de l'absence de guillemets (?). Quoi qu'il en soit, j'ai renommé les variables en utilisant dplyr :: rename pour que les noms ne dépendent plus des variables mais des caractères. Ici vous pouvez voir le code final Je demande:

fun<-function(df,var,group){ 
    enquo_var<-enquo(var) 
    enquo_group<-enquo(group) 

    r<-df%>% 
    reshape2::melt(., id.var=1, variable.name = "parameter")%>% 
    dplyr::rename(var = UQ(enquo_var))%>% 
    reshape2::dcast(data=., formula = var~parameter, value.var = "value") 

return(r) 
} 

funx<-fun(data,color,object) 

Bien que je trouve la solution à mon problème particulier, je vous serais reconnaissant de bien si quelqu'un me explique les raisons. PS: J'espère que la nouvelle version de Tidyr sera bientôt prête à faciliter ces tâches. Merci @hadley pour votre travail fantastique.

2

Nous pouvons utiliser dcast de data.table

library(data.table) 
dcast(setDT(data), color ~object, value.var = c("units", "price"), FUN = c(length, mean)) 
+0

Merci pour l'idée, @akrun mais j'ai le même message d'erreur 'Erreur dans melt.data.table (df, id.vars = var): objet 'couleur' ​​introuvable 'lors de l'utilisation de la fonction comme suit' fun <-fonction (df, var, groupe) { r <-reshape2 :: fusion (df, id.vars = var) r <-dcast (setDT (r), couleur ~ objet, valeur.var = c ("unités", "prix"), FUN = c (longueur, moyenne)) retour (r) } amusant (données, couleur, objet) ' – ungatoverde

+0

@ungatoverde Je ne reçois aucune erreur avec votre exemple en utilisant 'data.table_1.10.5' Oh okay, basé sur votre fonction, où' data' est dans le 'fun'. Je vois que vous avez créé un objet 'r' – akrun

+0

Désolé, vous avez raison. J'ai eu une erreur dans mon précédent commentaire. Je viens de le corriger. J'ajoute également les noms de fonction appropriés de data.table: \t 'fun <-fonction (df, var, groupe) {r <-data.table :: melt.data.table (df, id.vars = var) r <-data.table :: dcast.data.table (setDT (r), couleur ~ objet, valeur.var = c ("unités", "prix"), FUN = c (longueur, moyenne)) retour (r) } amusant (données, couleur, objet) 'mais toujours le même message d'erreur :-( – ungatoverde