Можно ли использовать разброс по нескольким столбцам в 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 ответ:
Одним из вариантов было бы создать новый '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