J'ai du mal à réorganiser la trame de données suivante:
set.seed(45)
dat1 <- data.frame(
name = rep(c("firstName", "secondName"), each=4),
numbers = rep(1:4, 2),
value = rnorm(8)
)
dat1
name numbers value
1 firstName 1 0.3407997
2 firstName 2 -0.7033403
3 firstName 3 -0.3795377
4 firstName 4 -0.7460474
5 secondName 1 -0.8981073
6 secondName 2 -0.3347941
7 secondName 3 -0.5013782
8 secondName 4 -0.1745357
Je veux le remodeler de sorte que chaque variable "nom" unique soit un nouveau nom, avec les "valeurs" comme observations le long de cette ligne et les "nombres" comme noms de colonnes. Un peu comme ça:
name 1 2 3 4
1 firstName 0.3407997 -0.7033403 -0.3795377 -0.7460474
5 secondName -0.8981073 -0.3347941 -0.5013782 -0.1745357
J'ai regardé melt
et cast
et quelques autres choses, mais aucune ne semble faire le travail.
Réponses:
Utilisation de la
reshape
fonction:la source
reshape
est fourni avecstats
. Sans oublier que c'est plus rapide! =)reshape
est un exemple exceptionnel pour une horrible API de fonction. C'est très proche de l'inutile.reshape
commentaires et les noms d'arguments similaires ne sont pas très utiles. Cependant, j'ai constaté que, de long à large, vous devez fournirdata =
votre data.frame,idvar
= la variable qui identifie vos groupes,v.names
= les variables qui deviendront plusieurs colonnes au format large,timevar
= la variable contenant les valeurs qui seront ajoutées auv.names
format large,,direction = wide
etsep = "_"
. Suffisamment clair? ;)Le nouveau
tidyr
package (en 2014) le fait aussi simplement, avecgather()
/spread()
étant les termes demelt
/cast
.Edit: Maintenant, en 2019, tidyr v 1.0 a lancé et défini
spread
etgather
sur un chemin de dépréciation, préférant à la placepivot_wider
etpivot_longer
, que vous pouvez trouver décrit dans cette réponse . Lisez la suite si vous voulez un bref aperçu de la brève vie despread/gather
.De github ,
la source
tidyr
etreshape2
. Il fournit de bons exemples et explications.Vous pouvez le faire avec la
reshape()
fonction ou avec les fonctionsmelt()
/cast()
dans le package de remodelage. Pour la deuxième option, l'exemple de code estOu en utilisant
reshape2
la source
cast
oudcast
ne fonctionnera pas correctement si vous n'avez pas de colonne "valeur" claire. Essayezdat <- data.frame(id=c(1,1,2,2),blah=c(8,4,7,6),index=c(1,2,1,2)); dcast(dat, id ~ index); cast(dat, id ~ index)
et vous n'obtiendrez pas ce que vous attendez. Vous devez noter explicitement levalue/value.var
-cast(dat, id ~ index, value="blah")
etdcast(dat, id ~ index, value.var="blah")
par exemple.Une autre option si les performances sont un problème est d’utiliser
data.table
l’extension dereshape2
fonctions de fusion et de coulée de( Référence: remodelage efficace à l'aide de data.tables )
Et, à partir de data.table v1.9.6, nous pouvons lancer sur plusieurs colonnes
la source
data.table
approche est la meilleure! très efficace ... vous verrez la différence quandname
est une combinaison de 30-40 colonnes !!En utilisant votre exemple de trame de données, nous pourrions:
la source
Deux autres options:
Paquet de base:
sqldf
paquet:la source
ValCol <- unique(dat1$numbers);s <- sprintf("MAX(CASE WHEN numbers = %s THEN value ELSE NULL END) `%s`,", ValCol, ValCol);mquerym <- gsub('.{1}$','',paste(s, collapse = "\n"));mquery <- paste("SELECT name,", mquerym, "FROM dat1", "GROUP BY name", sep = "\n");sqldf(mquery)
Utilisation de la
aggregate
fonction base R :la source
Avec la version devel de
tidyr
‘0.8.3.9000’
, il y apivot_wider
etpivot_longer
qui est généralisé pour faire le remodelage (long -> wide, wide -> long, respectivement) de 1 à plusieurs colonnes. Utilisation des données de l'OP- colonne simple longue -> large
-> créé une autre colonne pour montrer la fonctionnalité
la source
La
reshape
fonction de base fonctionne parfaitement bien:Où
idvar
est la colonne de classes qui sépare les lignestimevar
est la colonne des classes à diffuser largementv.names
est la colonne contenant des valeurs numériquesdirection
spécifie un format large ou longsep
argument facultatif est le séparateur utilisé entretimevar
les noms de classe etv.names
dans la sortiedata.frame
.Si aucun
idvar
n'existe, créez-en un avant d'utiliser lareshape()
fonction:N'oubliez pas que cela
idvar
est nécessaire! La partietimevar
etv.names
est facile. La sortie de cette fonction est plus prévisible que certaines des autres, car tout est explicitement défini.la source
Il y a nouveau package très puissant de scientifiques de données génie à Win-Vector ( les gens qui ont fait
vtreat
,seplyr
etreplyr
) appelécdata
. Il met en œuvre les principes de «données coordonnées» décrits dans ce document et également dans ce billet de blog . L'idée est que, quelle que soit la façon dont vous organisez vos données, il devrait être possible d'identifier des points de données individuels à l'aide d'un système de «coordonnées de données». Voici un extrait du récent billet de blog de John Mount:Nous allons d'abord créer la table de contrôle (voir l' article de blog pour plus de détails), puis effectuer le déplacement des données des lignes vers les colonnes.
la source
moyen beaucoup plus facile!
si vous voulez revenir de large à long, ne changez que Wide à Long, et aucun changement dans les objets.
la source