2014-07-24 13 views
53

Aşağıdaki yapay veriler vardır:Dcast'e benzer şekilde, birden çok sütun üzerinde yayma kullanmak mümkün mü?

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

iki ürün ülke kombinasyonları

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

almak ve her kombinasyon için yan değerleri yan görmek istiyorum. Ben dcast ile yapabilirsiniz:

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

o paketin tidyr den spread ile bunu yapmak mümkün mü?

cevap

53

Seçeneklerden biri, paste tarafından 'Ürün' ve 'Ülke' sütunları katılarak yeni bir 'Prod_Count' oluşturmak select olanlarda sütunları kaldırın ve tidyr den spread kullanılarak 'geniş' için 'uzun' dan yeniden şekillendirmek olacaktır.

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 

Ya da unitetidyr den (pancar yorumuna @ itibaren) kullanarak birkaç adım önlemek ve daha önce olduğu gibi yeniden şekillendirme yapabilirsiniz.

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

Evet, bu aklıma gelen ilk şeydi. Ama güzel değil :) – mpiktas

+0

@mpiktas. Sadece bu yöntemi düşünebilirim. Birisi başka bir kompakt kod ile gelebilir olabilir:) - – akrun

+9

de 'unite()' var ama sadece sayısal verilerle (amaca rağmen?) Çalışır gibi görünüyor. – beetroot

İlgili konular