2010-09-30 1 views
2

Soit il est tard, ou j'ai trouvé un bug, ou le casting n'aime pas les colnames avec "." en eux. Tout cela se passe à l'intérieur d'une fonction, mais cela "ne fonctionne pas" en dehors d'une fonction autant que cela ne fonctionne pas à l'intérieur de celle-ci.reshape: cast oddity

x <- structure(list(df.q6 = structure(c(1L, 1L, 1L, 11L, 11L, 9L, 
4L, 11L, 1L, 1L, 2L, 2L, 11L, 5L, 4L, 9L, 4L, 4L, 1L, 9L, 4L, 
10L, 1L, 11L, 9L), .Label = c("a", "b", "c", "d", "e", "f", "g", 
"h", "i", "j", "k"), class = "factor"), df.s5 = structure(c(4L, 
4L, 1L, 2L, 4L, 4L, 4L, 3L, 4L, 1L, 2L, 1L, 2L, 4L, 1L, 3L, 4L, 
2L, 2L, 4L, 4L, 4L, 2L, 2L, 1L), .Label = c("a", "b", "c", "d", 
"e"), class = "factor")), .Names = c("df.q6", "df.s5"), row.names = c(NA, 
25L), class = "data.frame") 

cast(x, df.q6 + df.s5 ~., length) 

Pas d'objet.

Cependant, si:

colnames(x) <- c("variable", "value") 
cast(x, variable + value ~., length) 

fonctionne comme un charme.

+0

comportement identique à R 2.11.1 (W7), et reshape_0.8.3 plyr_1.2.1. –

Répondre

3

Rien à voir avec les points dans les colnames (facilement représentés!).

Si votre dataframe n'a pas de colonne appelée 'value' alors cast() devine quelle colonne est la valeur - dans ce cas, il devine 'df.s5' comme c'est la dernière colonne. C'est ce que vous obtenez lorsque vous faites fondre() des données. Il renomme ensuite cette colonne en 'value' avant d'appeler reshape1. Maintenant la colonne 'df.s5' n'est plus, pourtant elle est là à gauche de votre formule. Oh oh.

Vous utilisez la valeur dans la formule, ce qui est une chose étrange à faire. Aucun des exemples de casting ne le fait. Qu'est-ce que vous essayez de faire ici?

Vous pouvez ajouter une colonne ad hoc en tant que valeur factice:

> cast(cbind(x,1), df.q6+s5~., length) 

En utilisant 1 colonne de valeur. Utilisez l'argument de valeur pour lancer ce choix pour passer outre

df.q6 s5 (all) 
1  a a  2 
2  a b  2 
3  a d  3 
4  b a  1 
5  b b  1 
[etc] 

Mais je pense qu'il ya une meilleure façon d'obtenir le nombre d'observations répétées (lignes) dans une trame de données - qui est votre vraie question!

+0

La diffusion des données de cette manière facilite la création de graphiques comme ceci: http://stackoverflow.com/questions/2578961/how-to-better-create-stacked-bar-graphs-with-multiple-variables-from- ggplot2/3784878 # 3784878 –

+1

Avez-vous construit une solution complète à la question dans le fil que vous avez lié? stackoverflow.com/questions/2578961/ – Jay

+0

Oui. Ce que vous voyez là fonctionne –

2

si vous êtes à la recherche d'une solution facile, dcast dans le paquet reshape2 peut vous aider:

library(reshape2) 
dcast(x, df.q6 + df.s5 ~., length) 
+0

Merci pour la tête sur reshape2. –

4

Pour moi, j'utiliser une solution similaire à ce que fait Spacedman sur.

#take your data.frame x with it's two columns 

#add a column 
x$value <- 1 

#apply your cast verbatim 
cast(x, df.q6 + df.s5 ~., length) 

    df.q6 df.s5 (all) 
1  a  a  2 
2  a  b  2 
3  a  d  3 
4  b  a  1 
5  b  b  1 
6  d  a  1 
7  d  b  1 
8  d  d  3 
9  e  d  1 
10  i  a  1 
11  i  c  1 
12  i  d  2 
13  j  d  1 
14  k  b  3 
15  k  c  1 
16  k  d  1 

Espérons que cela aide!

Jay

+0

Étrange mécanique, mais ça marche. –

+0

Essentiellement, il faut "quelque chose" pour compter, c'est-à-dire appliquer length() à. Parce qu'il est configuré pour la sortie melt(), le nom de la variable "value" fonctionne, mais est-ce que je devrais penser à autre chose? La variable restante est considérée comme la variable "valeur"? – Jay

+0

Aussi en plyr, peut-être comme ça? ddply (x,. (df.q6, df.s5), résume, nombre = longueur (df.q6)) – Jay