2017-05-14 3 views
-1

J'essaye de remodeler mes données d'une formule longue à large en utilisant la fonction dcast.Remodeler les données du format long au format large - plus d'une variable

L'objectif est d'utiliser différentes variables dans le paramètre value.var mais R ne me laisse pas utiliser plus d'une valeur.

Existe-t-il un autre moyen de le réparer? J'ai examiné d'autres questions similaires, mais je n'ai pas été en mesure de trouver des exemples similaires.

J'envoie les détails

Voici mon jeu de données actuel Dataset - monde

+---------+------+--------+--------------+------------+ 
| Country | Year | Growth | Unemployment | Population | 
+---------+------+--------+--------------+------------+ 
| A  | 2015 |  2 |   8.3 |   40 | 
| B  | 2015 |  3 |   9.2 |   32 | 
| C  | 2015 | 2.5 |   9.1 |   30 | 
| D  | 2015 | 1.5 |   6.1 |   27 | 
| A  | 2016 |  4 |   8.1 |   42 | 
| B  | 2016 | 3.5 |   9 |  32.5 | 
| C  | 2016 | 3.7 |   9 |   31 | 
| D  | 2016 | 3.1 |   5.3 |   29 | 
| A  | 2017 | 4.5 |   8.1 |  42.5 | 
| B  | 2017 | 4.4 |   8.4 |   33 | 
| C  | 2017 | 4.3 |   8.5 |   30 | 
| D  | 2017 | 4.2 |   5.2 |   30 | 
+---------+------+--------+--------------+------------+ 

Mon objectif est de passer colonne année au reste des colonnes (croissance, chômage et population) . J'utilise la fonction ci-dessous dcast.

data_wide <- dcast(world, country ~ year, 
    value.var=c("Growth","Unemployment","Population")) 

résultat idéal

+---------+-------------+-------------------+-----------------+-------------+-------------------+-----------------+ 
| Country | Growth_2015 | Unemployment_2015 | Population_2015 | Growth_2016 | Unemployment_2016 | Population_2016 | 
+---------+-------------+-------------------+-----------------+-------------+-------------------+-----------------+ 
| A  |   2 |    8.3 |    40 |   4 |    8.1 |    42 | 
| B  |   3 |    9.2 |    32 |   3.5 |     9 |   32.5 | 
| C  |   2.5 |    9.1 |    30 |   3.7 |     9 |    31 | 
| D  |   1.5 |    6.1 |    27 |   3.1 |    5.3 |    29 | 
+---------+-------------+-------------------+-----------------+-------------+-------------------+-----------------+ 
+3

Ne postez pas seulement des images. Publiez également la sortie de 'dput (X)' où X est votre trame de données d'entrée (ou une version suffisamment réduite si elle est grande). Sans cela personne ne peut essayer vos données sans les taper toutes manuellement et on ne peut pas être absolument sûr des classes des colonnes. –

+0

Ma première supposition serait d'essayer 'reshape (monde, direction =" large ", timevar =" Année ", idvar =" Pays ")' –

+0

Bonjour @Juan. Vous pouvez réellement éditer votre question, enlever vos images et copier-coller les valeurs à la place. De plus, comme indiqué dans les commentaires précédents, il serait très utile d'ajouter le résultat de 'dput (X)'. Il est plus facile pour quiconque veut fournir une réponse qui fonctionne. Merci! – lrnzcig

Répondre

0

La déclaration dcast() donnée par l'OP fonctionne presque parfaitement avec les versions récentes du package data.table car ceux-ci permettent de plusieurs variables de mesure à utiliser avec dcast() et melt():

library(data.table) # CRAN version 1.10.4 
setDT(world) # coerce to data.table 
data_wide <- dcast(world, Country ~ Year, 
        value.var = c("Growth", "Unemployment", "Population")) 

data_wide 
# Country Growth_2015 Growth_2016 Growth_2017 Unemployment_2015 Unemployment_2016 Unemployment_2017 Population_2015 
#1:  A   2.0   4.0   4.5    8.3    8.1    8.1    40 
#2:  B   3.0   3.5   4.4    9.2    9.0    8.4    32 
#3:  C   2.5   3.7   4.3    9.1    9.0    8.5    30 
#4:  D   1.5   3.1   4.2    6.1    5.3    5.2    27 
# Population_2016 Population_2017 
1:   42.0   42.5 
2:   32.5   33.0 
3:   31.0   30.0 
4:   29.0   30.0 

Ce résultat est le même que le tidyr solution.


Cependant, l'OP a demandé un ordre de colonne spécifique pour sa solution idéale où les différentes variables de mesure de chaque année sont regroupés.

Si le bon ordre des colonnes est important, il existe deux façons d'y parvenir. La première approche consiste à réorganiser les colonnes en utilisant de manière appropriée setcolorder():

new_ord <- CJ(world$Year, c("Growth","Unemployment","Population"), 
       sorted = FALSE, unique = TRUE)[, paste(V2, V1, sep = "_")] 
setcolorder(data_wide, c("Country", new_ord)) 

data_wide 
# Country Growth_2015 Unemployment_2015 Population_2015 Growth_2016 Unemployment_2016 Population_2016 Growth_2017 
#1:  A   2.0    8.3    40   4.0    8.1   42.0   4.5 
#2:  B   3.0    9.2    32   3.5    9.0   32.5   4.4 
#3:  C   2.5    9.1    30   3.7    9.0   31.0   4.3 
#4:  D   1.5    6.1    27   3.1    5.3   29.0   4.2 
# Unemployment_2017 Population_2017 
#1:    8.1   42.5 
#2:    8.4   33.0 
#3:    8.5   30.0 
#4:    5.2   30.0 

Notez les les croix se joignent fonction CJ() est utilisé pour créer le produit croisé des vecteurs.


L'autre approche pour atteindre l'ordre de la colonne désirée est de fusion et recast:

molten <- melt(world, id.vars = c("Country", "Year")) 
dcast(molten, Country ~ Year + variable) 
# Country 2015_Growth 2015_Unemployment 2015_Population 2016_Growth 2016_Unemployment 2016_Population 2017_Growth 
#1:  A   2.0    8.3    40   4.0    8.1   42.0   4.5 
#2:  B   3.0    9.2    32   3.5    9.0   32.5   4.4 
#3:  C   2.5    9.1    30   3.7    9.0   31.0   4.3 
#4:  D   1.5    6.1    27   3.1    5.3   29.0   4.2 
# 2017_Unemployment 2017_Population 
#1:    8.1   42.5 
#2:    8.4   33.0 
#3:    8.5   30.0 
#4:    5.2   30.0 
+0

Merci beaucoup @Uwe Block, je l'apprécie vraiment. J'ai essayé les différentes méthodes et cela semble fonctionner correctement. J'ai juste inclus setDT dans la première formule et il remplit la bonne table. 'data_wide <- dcast (setDT (monde), Pays ~ Année, value.var = c (" Croissance "," Chômage "," Population "))'. L'exemple fondu fonctionne parfaitement. – Juanma

+0

Pas de soucis. C'était vraiment utile. Je reviendrai à vous si j'ai d'autres questions. Merci beaucoup. – Juanma

0

Si vous n'êtes pas marié à une solution dcast, je trouve tidyr plus facile.

library(tidyr) 
df <- df %>% 
    gather(key, value, -Country, -Year) %>% 
    unite(new.col, c(key, Year)) %>% 
    spread(new.col, value) 

Résultat

Country Growth_2015 Growth_2016 Growth_2017 Population_2015 Population_2016 Population_2017 Unemployment_2015 Unemployment_2016 Unemployment_2017 
1  A   2.0   4.0   4.5    40   42.0   42.5    8.3    8.1    8.1 
2  B   3.0   3.5   4.4    32   32.5   33.0    9.2    9.0    8.4 
3  C   2.5   3.7   4.3    30   31.0   30.0    9.1    9.0    8.5 
4  D   1.5   3.1   4.2    27   29.0   30.0    6.1    5.3    5.2 

Cela fonctionne par

empilage toutes les valeurs dans une colonne ...

La combinaison de nom de variable et colonnes année dans une seule colonne ...

La nouvelle colonne est ensuite diffusée en format large

+0

S'il vous plaît montrer le résultat, merci. – Uwe

+0

Merci pour la réponse. J'ai juste couru le code et ai eu l'erreur suivante: Erreur: is.character (x) n'est pas VRAI. En regardant maintenant. – Juanma

+0

Hmm, désolé @Juan, cela semble bien fonctionner, pour moi, avec les données que vous avez fournies. Avez-vous l'erreur avec ce sous-ensemble? Qu'en est-il si vous exécutez seulement la ligne «rassembler» sur votre ensemble de données complet? – user127649