Можно ли использовать разброс по нескольким столбцам в tidyr, подобный dcast?


У меня есть следующие фиктивные данные:

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))

Я выбираю две комбинации продукт-страна

sdt <- dt %>% filter((Product == "A" & Country == "AI") | (Product == "B" & Country =="EI"))

И я хочу видеть значения бок о бок для каждой комбинации. Я могу сделать это с помощью dcast:

sdt %>% dcast(Year ~ Product + Country)

Можно ли это сделать с помощью spread из пакета tidyr ?

1 55

1 ответ:

Одним из вариантов было бы создать новый 'Prod_Count', объединив столбцы 'Product' и ' Country 'с помощью paste, удалить эти столбцы с помощью select и изменить форму с' long 'на' wide', используя spread из 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

Или мы можем избежать нескольких шагов, используя unite из tidyr (из комментария @beetroot) и изменить форму, как и раньше.

 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