2014-12-16 7 views
10

मैं प्लीयर से आ रहा हूं, मैं dplyr सीख रहा हूं, और मैं xtabs के आउटपुट से (प्रति समूह) कॉलम (प्रति इंटरैक्शन) उत्पन्न करना चाहता हूं।टिडिर फैल फ़ंक्शन स्पैर मैट्रिक्स उत्पन्न करता है जब कॉम्पैक्ट वेक्टर अपेक्षित

संक्षिप्त सारांश:

> xtabs(data=data.frame(P=c(F,T,F,T,F),A=c(F,F,T,T,T))) 
     A 
P  FALSE TRUE 
    FALSE  1 2 
    TRUE  1 1 

अब do( चाहता है उस में डेटा है: मैं

A B 
1 NA 
NA 2 

हो रही है जब मैं

A B 
1 2 

xtabs डेटा चाहता था इस तरह दिखता है डेटा फ्रेम, इस तरह:

> xtabs(data=data.frame(P=c(F,T,F,T,F),A=c(F,F,T,T,T))) %>% as.data.frame 
     P  A Freq 
1 FALSE FALSE 1 
2 TRUE FALSE 1 
3 FALSE TRUE 2 
4 TRUE TRUE 1 

अब मैं कॉलम के साथ एक एकल पंक्ति आउटपुट चाहता हूं जो स्तरों की बातचीत हो। यहाँ मैं के लिए क्या देख रहा हूँ है:

FALSE_FALSE TRUE_TRUE FALSE_TRUE TRUE_FALSE 
      1   1   2   1 

लेकिन बजाय मैं

> xtabs(data=data.frame(P=c(F,T,F,T,F),A=c(F,F,T,T,T))) %>% 
    as.data.frame %>% 
    unite(S,A,P) %>% 
    spread(S,Freq) 
    FALSE_FALSE FALSE_TRUE TRUE_FALSE TRUE_TRUE 
1   1   NA   NA  NA 
2   NA   1   NA  NA 
3   NA   NA   2  NA 
4   NA   NA   NA   1 

मिल मैं स्पष्ट रूप से यहाँ कुछ गलतफहमी कर रहा हूँ। मैं यहाँ reshape2 के कोड के बराबर की तलाश में हूँ (स्थिरता के लिए magrittr पाइप का प्रयोग करके):

> xtabs(data=data.frame(P=c(F,T,F,T,F),A=c(F,F,T,T,T))) %>% 
    as.data.frame %>% # can be omitted. (safely??) 
    melt %>% 
    mutate(S=interaction(P,A),value=value) %>% 
    dcast(NA~S) 
Using P, A as id variables 
    NA FALSE.FALSE TRUE.FALSE FALSE.TRUE TRUE.TRUE 
1 NA   1   1   2   1 

(ध्यान दें एनए यहाँ क्योंकि मैं इस सरल उदाहरण में एक समूहीकरण चर नहीं है प्रयोग किया जाता है)


अद्यतन - दिलचस्प बात यह है कि एक समूहबद्ध कॉलम जोड़ने से यह ठीक हो जाता है - यह मुझे बताए बिना समूहबद्ध कॉलम (संभावित रूप से row_name से) क्यों संश्लेषित करता है?

> xtabs(data=data.frame(h="foo",P=c(F,T,F,T,F),A=c(F,F,T,T,T))) %>% 
    as.data.frame %>% 
    unite(S,A,P) %>% 
    spread(S,Freq) 
    h FALSE_FALSE FALSE_TRUE TRUE_FALSE TRUE_TRUE 
1 foo   1   1   2   1 

यह आंशिक समाधान की तरह लगता है।

+3

[** यह **] (https://github.com/hadley/tidyr/issues/41) एक ही समस्या की तरह लगता है। – Henrik

+0

@ हेनरिक: वास्तव में यह करता है। –

+0

[यह] (http://stackoverflow.com/q/25960394/937932) हैडली द्वारा व्याख्यात्मक टिप्पणी के साथ, विपरीत में एक ही समस्या है। जैसा कि आपने अपने अपडेट में खोजा है, दोनों आउटपुट सही संदर्भ में समझ में आते हैं। जब संदर्भ केवल निहित है, 'फैल() 'अनुमान लगाना है। – nacnudus

उत्तर

5

यहां कुंजी यह है कि spread डेटा को एकत्र नहीं करता है।

इसलिए, अगर आप पहले से ही xtabs इस्तेमाल नहीं किया था पहले एकत्र करने के लिए, यदि आप ऐसा करने की जाएगी:

a <- data.frame(P=c(F,T,F,T,F),A=c(F,F,T,T,T), Freq = 1) %>% 
    unite(S,A,P) 
a 
##    S Freq 
## 1 FALSE_FALSE 1 
## 2 FALSE_TRUE 1 
## 3 TRUE_FALSE 1 
## 4 TRUE_TRUE 1 
## 5 TRUE_FALSE 1 

a %>% spread(S, Freq) 
## FALSE_FALSE FALSE_TRUE TRUE_FALSE TRUE_TRUE 
## 1   1   NA   NA  NA 
## 2   NA   1   NA  NA 
## 3   NA   NA   1  NA 
## 4   NA   NA   NA   1 
## 5   NA   NA   1  NA 

कौन सा अर्थ किसी अन्य तरीके से (एकत्रीकरण के बिना) नहीं होगा।

यह fill पैरामीटर के लिए मदद फ़ाइल के आधार पर पूर्वानुमान है:

अगर वहाँ अन्य चर और महत्वपूर्ण स्तंभ के प्रत्येक संयोजन के लिए एक मूल्य नहीं है, यह मान प्रतिस्थापित किया जाएगा।

आपके मामले में, कुंजी कॉलम के साथ गठबंधन करने के लिए कोई अन्य चर नहीं हैं। अगर वहां गया था, तो ...

b <- data.frame(P=c(F,T,F,T,F),A=c(F,F,T,T,T), Freq = 1 
           , h = rep(c("foo", "bar"), length.out = 5)) %>% 
    unite(S,A,P) 
b 
##    S Freq h 
## 1 FALSE_FALSE 1 foo 
## 2 FALSE_TRUE 1 bar 
## 3 TRUE_FALSE 1 foo 
## 4 TRUE_TRUE 1 bar 
## 5 TRUE_FALSE 1 foo 

> b %>% spread(S, Freq) 
## Error: Duplicate identifiers for rows (3, 5) 

... यह असफल हो जाएगा, क्योंकि यह पंक्तियों 3 और 5 को एकत्र नहीं कर सकता है (क्योंकि यह डिज़ाइन नहीं किया गया है)।

tidyr/dplyr यह group_by और summarize बजाय xtabs होगा, क्योंकि summarize समूहीकरण स्तंभ को बरकरार रखता है, इसलिए spread बता सकते हैं जो टिप्पणियों एक ही पंक्ति में हैं करने के लिए जिस तरह से:

b %>% group_by(h, S) %>% 
    summarize(Freq = sum(Freq)) 
## Source: local data frame [4 x 3] 
## Groups: h 
## 
##  h   S Freq 
## 1 bar FALSE_TRUE 1 
## 2 bar TRUE_TRUE 1 
## 3 foo FALSE_FALSE 1 
## 4 foo TRUE_FALSE 2 

b %>% group_by(h, S) %>% 
    summarize(Freq = sum(Freq)) %>% 
    spread(S, Freq) 
## Source: local data frame [2 x 5] 
## 
##  h FALSE_FALSE FALSE_TRUE TRUE_FALSE TRUE_TRUE 
## 1 bar   NA   1   NA   1 
## 2 foo   1   NA   2  NA 
+0

लेकिन जब अधिकतम पहचान सेट को समूहित करते समय dplyr समूहों के साथ संयोजन में उपयोग किया जाता है तो हमारे पास एक अंतर्निहित एकत्रीकरण होता है: जो वास्तव में आईआईआरसी सही ढंग से काम नहीं करता है। –

+1

अधिकतम पहचान सेट क्या है? मुझे नहीं लगता कि डमी ग्रुपिंग वैरिएबल की आपूर्ति करने का कोई विकल्प है। आप इसे मूल डेटा फ्रेम में कर सकते हैं, या आप 'group_by (1) 'को' स्प्रेड 'से पहले कर सकते हैं और फिर' (-'1') 'बाद में चुनें। – nacnudus

+0

मेरा मतलब है कि एक बार कुंजी और मूल्य के अलावा सभी चर को group_by संचालन में 'गणक' के रूप में उपभोग किया गया है। धन्यवाद वैसे भी –

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