2013-06-03 1 views
6

J'ai un script qui nécessite les bibliothèques reshape et reshape2. Je sais que c'est une mauvaise pratique, mais je pense plyr (ou une autre bibliothèque que j'utilise) Vennerable est en train de charger reshape et j'ai personnellement utilisé reshape2 dans beaucoup d'endroits.Le masquage du paquetage Reshape empêche la fusion des colonnes de dénomination

Le problème est que le masquage de reshape2 par reshape est à l'origine des problèmes de la fonction melt

# Example data frame 
df <- data.frame(id=c(1:5), a=c(rnorm(5)), b=c(rnorm(5))) 

# With just reshape2, variable and value columns are labelled correctly 
library(reshape2) 
melt(df, measure.vars=c("a", "b"), variable.name="type", value.name="distance") 
    id type distance 
1 1 a -2.0233666 
2 2 a 0.4625188 
3 3 a -2.8688127 
4 4 a 0.8151644 
5 5 a -0.4574464 
6 1 b 1.3197784 
7 2 b 1.6213146 
8 3 b 1.3508913 
9 4 b -1.6483839 
10 5 b -1.1342157 

# But my script also has reshape loaded 
library(reshape) 
Loading required package: plyr 

Attaching package: ‘reshape’ 

The following object(s) are masked from ‘package:plyr’: 

    rename, round_any 

The following object(s) are masked from ‘package:reshape2’: 

    colsplit, melt, recast 

# When calling melt in this environment, variable and value columns stick to 
# their default names 
melt(df, measure.vars=c("a", "b"), variable.name="type", value.name="distance") 
    id variable  value 
1 1  a -2.0233666 
2 2  a 0.4625188 
3 3  a -2.8688127 
4 4  a 0.8151644 
5 5  a -0.4574464 
6 1  b 1.3197784 
7 2  b 1.6213146 
8 3  b 1.3508913 
9 4  b -1.6483839 
10 5  b -1.1342157 

Je pensais que je pouvais appeler spécifiquement melt de reshape2 en utilisant reshape2::melt mais je reçois toujours le même problème.

Y at-il un moyen facile de contourner ce problème? Sinon, je devrai ré-étiqueter manuellement les noms des colonnes directement après chaque appel de fusion.

+1

Je ne pense pas que la nouvelle version de '' plyr' utilise reshape' plus. Est-ce la seule raison pour laquelle vous avez importé "reshape"? – Peyton

+0

Je ne l'importe pas personnellement, mais je pense qu'une autre bibliothèque est et je ne peux pas savoir laquelle. Je me doutais qu'il était plyr à cause de l'ordre de la sortie. – MattLBeck

+1

Vérifiez chacun des paquets comme ceci: 'installed.packages() [installed.packages() [, 1] ==" ggplot2 ",]' – Roland

Répondre

7

Utilisez reshape2:::melt.data.frame(...).

melt est en fait une méthode:

> reshape2::melt 
function (data, ..., na.rm = FALSE, value.name = "value") 
{ 
    UseMethod("melt", data) 
} 
<environment: namespace:reshape2> 

Ainsi, dans le cas d'une trame de données, R recherchera melt.data.frame, qui est en reshape:

> melt.data.frame 
function (data, id.vars, measure.vars, variable_name = "variable", 
    na.rm = !preserve.na, preserve.na = TRUE, ...) 
{ 
    ... 
} 
<environment: namespace:reshape> 

Comme je l'ai indiqué que, la meilleure solution pourrait juste être de tout améliorer. Il est vrai que plyr utilisé pour charger reshape, mais ce n'est plus le cas. (Edit: je pensais ggplot2.)

+0

Ah, brillant. J'essayais aussi 'reshape2 :: melt.data.frame (...)' mais je ne savais pas que j'avais besoin de trois colons (il se plaignait que 'melt.data.frame' n'était pas exporté autrement). Aussi, applaudissements pour le conseil de mise à niveau. – MattLBeck

+1

Oui, l'opérateur triple-côlon saisira les valeurs internes (c'est-à-dire non exportées). – Peyton

+0

Assurez-vous de spécifier le formulaire approprié pour votre jeu de données, dans ce cas melt.data.frame, mais les autres formes incluent: melt.array, melt.list, melt.matrix, melt.table et melt.default (pour les vecteurs) – woodvi

0

Tenir compte du déchargement du paquet Reshape et recharger à nouveau si nécessaire

detach("package:reshape", unload=TRUE) 
Questions connexes