2014-07-24 5 views
53

Mam następujące dane manekina:Czy można używać rozkładówki na wielu kolumnach w tidyr podobnym do dcastu?

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

wybiorę dwie kombinacje produktów krajów

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

i chcę zobaczyć stronę wartości, strony dla każdej kombinacji. Mogę to zrobić z dcast:

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

Czy można to zrobić z spread z pakietu tidyr?

Odpowiedz

53

Jednym rozwiązaniem byłoby, aby utworzyć nowy „Prod_Count” przyłączając się do „produkt” i kolumny „kraj” przez paste, usuń te kolumny z select i przekształcenia z „długi” do „szeroko” używanie spread z 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 

Albo możemy uniknąć parę kroków za pomocą unite z tidyr (od @ komentarzu buraki) i przekształcenia, jak wcześniej.

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 
+1

Tak, to pierwsza rzecz, która przyszła mi do głowy. Ale to nie jest ładne :) – mpiktas

+0

@mpiktas. Mogę myśleć tylko o tej metodzie. Może być ktoś inny wymyśli kompaktowy kod:) - – akrun

+9

dobrze istnieje 'unite()', ale wydaje się, że działa tylko z danymi liczbowymi (celowo jednak?). – beetroot

Powiązane problemy