J'ai les données fictives suivantes:
library(dplyr)
library(tidyr)
library(reshape2)
dt <- expand.grid(Year = 1990:2014, Product=LETTERS[1:8], Country = paste0(LETTERS, "I")) %>% select(Product, Country, Year)
dt$value <- rnorm(nrow(dt))
Je choisis deux combinaisons produit-pays
sdt <- dt %>% filter((Product == "A" & Country == "AI") | (Product == "B" & Country =="EI"))
et je veux voir les valeurs côte à côte pour chaque combinaison. Je peux le faire avec dcast
:
sdt %>% dcast(Year ~ Product + Country)
Est-il possible de le faire avec spread
du paquet tidyr?
Une option serait de créer un nouveau "Prod_Count" en joignant les colonnes "Product" et "Country" par paste
, supprimer ces colonnes avec le select
et remodeler de "long" à "wide" 'en utilisant spread
de tidyr
.
library(dplyr)
library(tidyr)
sdt %>%
mutate(Prod_Count=paste(Product, Country, sep="_")) %>%
select(-Product, -Country)%>%
spread(Prod_Count, value)%>%
head(2)
# Year A_AI B_EI
#1 1990 0.7878674 0.2486044
#2 1991 0.2343285 -1.1694878
Ou nous pouvons éviter quelques étapes en utilisant unite
de tidyr
(du commentaire de @ beetroot) et remodeler comme avant.
sdt%>%
unite(Prod_Count, Product,Country) %>%
spread(Prod_Count, value)%>%
head(2)
# Year A_AI B_EI
# 1 1990 0.7878674 0.2486044
# 2 1991 0.2343285 -1.1694878
Avec la version de développement actuelle de tidyr, cela peut être accompli avec un appel de fonction (pivot_wider()
).
pivot_wider()
(homologue: pivot_longer()
) fonctionne de manière similaire à spread()
. Cependant, il offre des fonctionnalités supplémentaires telles que l'utilisation de plusieurs colonnes clé/nom (et/ou plusieurs colonnes valeur). À cette fin, l'argument names_from
— qui indique de quelle (s) colonne (s) les noms des nouvelles variables sont extraits - peut prendre plus d'un nom de colonne (ici Product
et Country
).
library("tidyr")
packageVersion("tidyr")
#> [1] '0.8.3.9000'
sdt %>%
pivot_wider(id_cols = Year, names_from = c(Product, Country)) %>%
head(2)
#> # A tibble: 2 x 3
#> Year A_AI B_EI
#> <int> <dbl> <dbl>
#> 1 1990 -2.08 -0.113
#> 2 1991 -1.02 -0.0546
Voir aussi: https://tidyr.tidyverse.org/dev/articles/pivot.html