2014-07-24 6 views
53

Ho i seguenti dati fittizi:È possibile utilizzare lo spread su più colonne in tidyr simile a 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)) 

prendo due combinazioni prodotto-paese

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

e voglio vedere il lato i valori a fianco per ogni combinazione. Posso fare questo con dcast:

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

E 'possibile farlo con spread dal pacchetto tidyr?

risposta

53

Una possibilità potrebbe essere quella di creare un nuovo 'Prod_Count' aderendo al 'prodotto' e le colonne 'Paese' da paste, rimuovere le colonne con la select e rimodellare da 'lungo' a 'ampia' utilizzando spread da 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 

Oppure possiamo evitare un paio di passi utilizzando unite da tidyr (da @ commento di barbabietola) e rimodellare come prima.

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

Sì, questa è stata la prima cosa che mi è venuta in mente. Ma non è carino :) – mpiktas

+0

@mpiktas. Posso solo pensare a questo metodo. Potrebbe essere qualcun altro a inventare un codice compatto:) - – akrun

+9

beh c'è 'unite()' ma sembra funzionare solo con dati numerici (di proposito però?). – beetroot

Problemi correlati