2014-07-24 5 views
53

मैं निम्नलिखित डमी डेटा है:क्या डैककास्ट के समान tidyr में एकाधिक कॉलम पर फैलाना संभव है?

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) 

यह पैकेज tidyr से spread के साथ ऐसा करना संभव है?

उत्तर

53

एक विकल्प paste द्वारा 'उत्पाद' और 'देश' कॉलम में शामिल होने से एक नया 'Prod_Count' बनाने के लिए, select साथ उन लोगों के कॉलम निकाल कर tidyr से spread का उपयोग कर 'विस्तृत' को 'लंबी' से नयी आकृति प्रदान करना होगा।

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 

या हम unitetidyr से (से @ चुकंदर की टिप्पणी) का उपयोग करके चरणों की एक जोड़ी से बचने और पहले की तरह नयी आकृति प्रदान कर सकते हैं।

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

हाँ, यह मेरी पहली बात थी जो मेरे दिमाग में आई थी। लेकिन यह सुंदर नहीं है :) – mpiktas

+0

@mpiktas। मैं केवल इस विधि के बारे में सोच सकता हूं। हो सकता है कि कोई और कॉम्पैक्ट कोड के साथ आएगा:) - – akrun

+9

अच्छी तरह से 'एकजुट() 'है लेकिन ऐसा लगता है कि यह केवल संख्यात्मक डेटा (उद्देश्य पर हालांकि) के साथ काम करता है। – beetroot

संबंधित मुद्दे