2014-09-21 9 views
20

मान लीजिए मैं कुछ गिनती डेटा है कि इस तरह दिखता है:उचित मुहावरा/dplyr

X.tidy <- X.raw %>% group_by(x,y) %>% summarise(count=sum(z)) 
X.tidy 
# Source: local data frame [3 x 3] 
# Groups: x 
# 
# x y count 
# 1 A i  1 
# 2 A ii  5 
# 3 B i 15 

:

library(tidyr) 
library(dplyr) 

X.raw <- data.frame(
    x = as.factor(c("A", "A", "A", "B", "B", "B")), 
    y = as.factor(c("i", "ii", "ii", "i", "i", "i")), 
    z = 1:6) 
X.raw 
# x y z 
# 1 A i 1 
# 2 A ii 2 
# 3 A ii 3 
# 4 B i 4 
# 5 B i 5 
# 6 B i 6 

मैं साफ और इस तरह संक्षेप में प्रस्तुत करना चाहते हैं मुझे पता है कि x=="B" और y=="ii" के लिए हमने गुम मूल्य के बजाय शून्य की गिनती देखी है। यानी फील्ड वर्कर वास्तव में वहां था, लेकिन क्योंकि कोई सकारात्मक गिनती नहीं थी कच्चे डेटा में कोई पंक्ति दर्ज नहीं की गई थी। मैं इसे शून्य करके स्पष्ट रूप से शून्य गणना जोड़ सकता हूं:

X.fill <- X.tidy %>% spread(y, count, fill=0) %>% gather(y, count, -x) 
X.fill 
# Source: local data frame [4 x 3] 
# 
# x y count 
# 1 A i  1 
# 2 B i 15 
# 3 A ii  5 
# 4 B ii  0 

लेकिन यह चीजों को करने का एक चौराहे तरीका लगता है। क्या उनके लिए यह एक क्लीनर मुहावरे है?

बस स्पष्ट करने के लिए: मेरी कोड पहले से ही मैं यह क्या करने की जरूरत है, spread तो gather का उपयोग कर, तो क्या मैं में दिलचस्पी रखता हूँtidyr और dplyr के भीतर एक अधिक सीधा रास्ता जा रहे हैं।

+0

क्या आप जानते हैं "बी" के लिए/"ii" वहाँ शून्य का एक मनाया गिनती है कि, क्यों कि नहीं है अपने स्रोत में:

# Complete after ungrouping X.tidy %>% ungroup %>% complete(x, y, fill = list(count = 0)) # Complete within grouping X.tidy %>% complete(y, fill = list(count = 0)) 

परिणाम प्रत्येक विकल्प के लिए एक ही है डाटासेट? आपका स्रोत डेटासेट वर्तमान में उस संयोजन को याद करता है जो गायब है। – A5C1D2H2I1M1N2O1R2T1

+1

कच्चे डेटासेट में केवल सकारात्मक गणना शामिल है। लेकिन हम जानते हैं कि सभी संयोजनों का सर्वेक्षण किया गया था। – pete

+1

क्या आपके पास एक और टेबल है जो दिखाती है कि "x" और "y" के संयोजन क्या मान्य हैं? अन्यथा, आप '0' और' NA' के बीच अंतर करने की योजना कैसे बनाते हैं? – A5C1D2H2I1M1N2O1R2T1

उत्तर

14

से टिडर इस स्थिति के लिए बनाया गया है।

डॉक्स से:

यह एक आवरण के आसपास का विस्तार(), left_join() और replace_na डेटा की याद आ रही संयोजन पूरा करने के लिए उपयोगी है।

आप इसे दो तरीकों से उपयोग कर सकते हैं। सबसे पहले, आप इसे मूल डाटासेट पर इस्तेमाल कर सकते हैं सारांश, "पूरा" x और y के सभी संयोजनों के साथ डाटासेट, और z 0 के साथ भरने से पहले (आप डिफ़ॉल्ट NAfill का उपयोग करें और sum में na.rm = TRUE इस्तेमाल कर सकते हैं)।

X.raw %>% 
    complete(x, y, fill = list(z = 0)) %>% 
    group_by(x,y) %>% 
    summarise(count = sum(z)) 

Source: local data frame [4 x 3] 
Groups: x [?] 

     x  y count 
    <fctr> <fctr> <dbl> 
1  A  i  1 
2  A  ii  5 
3  B  i 15 
4  B  ii  0 

आप भी अपने पूर्व संक्षेप डेटासेट पर complete उपयोग कर सकते हैं। ध्यान दें कि complete समूहकरण का सम्मान करता है। X.tidy समूहबद्ध है, तो आप या तो ungroup कर सकते हैं और x और y द्वारा डेटासेट को पूरा कर सकते हैं या केवल उस समूह को सूचीबद्ध कर सकते हैं जिसे आप प्रत्येक समूह में पूरा करना चाहते हैं - इस मामले में, y

Source: local data frame [4 x 3] 

     x  y count 
    <fctr> <fctr> <dbl> 
1  A  i  1 
2  A  ii  5 
3  B  i 15 
4  B  ii  0 
2

आप स्पष्ट रूप से सभी संभव संयोजनों कर सकता है और उसके बाद साफ सारांश के साथ इसमें शामिल होने:

x.fill <- expand.grid(x=unique(x.tidy$x), x=unique(x.tidy$y)) %>% 
    left_join(x.tidy, by=("x", "y")) %>% 
    mutate(count = ifelse(is.na(count), 0, count)) # replace null values with 0's 
2

plyr कार्यक्षमता आप देख रहे हैं है, लेकिन dplyr (अभी तक) नहीं है, तो आप कुछ की जरूरत है @Momeara द्वारा दिखाए गए अनुसार, शून्य-गिनती समूहों को शामिल करने के लिए अतिरिक्त कोड। this question भी देखें। plyr::ddply में आप अंतिम परिणाम में शून्य-गिनती समूहों को रखने के लिए बस .drop=FALSE जोड़ें। उदाहरण के लिए:

library(plyr) 

X.tidy = ddply(X.raw, .(x,y), summarise, count=sum(z), .drop=FALSE) 

X.tidy 
    x y count 
1 A i  1 
2 A ii  5 
3 B i 15 
4 B ii  0 
+0

क्या आपको दूसरी पंक्ति में dplyr के बजाय ddply का मतलब है? – momeara

+0

हां। इसे पकड़ने के लिए धन्यवाद! मैंने इसे ठीक कर दिया है। – eipi10

3

आप कारकों के स्तर के सभी संयोजनों, और फिर left_join बनाने के लिए tidyr के expand उपयोग कर सकते हैं:

X.tidy %>% expand(x, y) %>% left_join(X.tidy) 

# Joining by: c("x", "y") 
# Source: local data frame [4 x 3] 
# 
# x y count 
# 1 A i  1 
# 2 A ii  5 
# 3 B i 15 
# 4 B ii NA 

तो फिर तुम 0 या किसी अन्य के साथ NAS के रूप में मान रखना या उन्हें जगह ले सकती मूल्य। इस तरह से समस्या का पूरा समाधान भी नहीं है, लेकिन यह spread & gather से तेज़ और अधिक रैम-अनुकूल है।

+2

tidyr (0.2.0.9000) के विकास संस्करण में 'पूर्ण' भी देखें, जो 'विस्तार',' left_join', और 'replace_na' के लिए एक आसान रैपर है। – aosmith

+0

ओह, जानकारी के लिए धन्यवाद! – inscaven

+0

धन्यवाद @ अस्मिथ जो मुझे चाहिए वही है। यदि आप इसे उत्तर के रूप में लिखते हैं तो मैं इसे स्वीकार करूंगा। – pete