Tengo los siguientes datos ficticios:
library(dplyr) library(tidyr) library(reshape2) dt % select(Product, Country, Year) dt$value <- rnorm(nrow(dt))
Escojo dos combinaciones producto-país
sdt % filter((Product == "A" & Country == "AI") | (Product == "B" & Country =="EI"))
y quiero ver los valores uno al lado del otro para cada combinación. Puedo hacer esto con dcast
:
sdt %>% dcast(Year ~ Product + Country)
¿Es posible hacer esto con spread
desde el paquete tidyr ?
Una opción sería crear un nuevo ‘Prod_Count’ uniendo las columnas ‘Producto’ y ‘País’ pegando, eliminar esas columnas con la select
y cambiar la forma de ‘largo’ a ‘ancho’ usando 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
O podemos evitar un par de pasos usando unite
de tidyr
(del comentario de @ tidyr
) y tidyr
forma como antes.
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