2013-10-18 6 views
6

मेरे पास है जो मैं rbindlist करना चाहता हूं। सारणी में कारक (संभावित रूप से गायब) के साथ कारक होते हैं। तब rbindlist(...)do.call(rbind(...)) से अलग ढंग से व्यवहार करती है:लापता स्तर वाले कारकों के लिए rbindlist

dt1 <- data.table(x=factor(c("a", "b"), levels=letters)) 

rbindlist(list(dt1, dt1))[,x] 
## [1] a b a b 
## Levels: a b 

do.call(rbind, list(dt1, dt1))[,x] 
## [1] a b a b 
## Levels: a b c d e f g h i j k l m n o p q r s t u v w x y z 

मैं स्तरों को बनाए रखना चाहते हैं, तो मैं टो सहारा की क्या ज़रूरत है rbind करने के लिए या वहाँ एक data.table तरीका है?

+4

तुम हमेशा के स्तर हड़पने इससे पहले कि आप 'rbindlist' फोन और फिर उन्हें वापस रख ([यहां] को देखने के (http://stackoverflow.com/questions/14634964/how कर सकते हैं -Does-एक-परिवर्तन-स्तर के- एक कारक-स्तंभ में एक-डेटा-तालिका))। लेकिन मुझे लगता है कि आप सही हैं 'बूंदों = TRUE' तर्क होना चाहिए। – Justin

उत्तर

4

मुझे लगता है कि rbindlist तेजी से है क्योंकि यह do.call(rbind.data.frame,...)

की जांच क्यों बंधन के बाद के स्तर को निर्धारित करने के लिए नहीं ऐसा नहीं करता है?

Dt <- rbindlist(list(dt1, dt1)) 
    setattr(Dt$x,"levels",letters) ## set attribute without a copy 
?setattr से

:

setattr() कई स्थितियों में उपयोगी संदर्भ द्वारा विशेषता सेट करने और एक वस्तु की किसी भी वस्तु या ओर से इस्तेमाल किया जा सकता है, बस data.tables नहीं।

+0

धन्यवाद। लेकिन जहां मैं वास्तव में इसका उपयोग करता हूं, मुझे स्तर नहीं पता। अगर मेरे पास 2 'data.tables' है, तो मुझे पहले से ही' अनन्य (असूची (लापरवाही (सूची (डीटी 1, डीटी 2), फ़ंक्शन (डीटी) स्तर (डीटी [, एक्स]) की आवश्यकता है)) '' स्तरों को खोजने के लिए, और मैं मुझे डर है तो 'do.call (rbind, ...)' संस्करण तेज हो सकता है। – shadow

+2

@ छाया मैं अनुमान लगा रहा हूं कि केवल धीमी हो जाएगी यदि आपके पास कारकों की एक बड़ी संख्या के साथ पंक्तियों की एक बड़ी संख्या है, जिसमें मैं पूछूंगा - कारक होने का क्या मतलब है? यदि आप आंतरिक 'c.factor' फ़ंक्शन का उपयोग करते हैं, तो आप केवल अंतिम चरण को गति दे सकते हैं, यदि मैं दोहराव वाले – eddi

+1

fwiw के साथ डेटा में बार-बार उपयोग किए जाने वाले तत्वों की एक छोटी संख्या का उपयोग करता हूं, तो आप केवल कारकों का उपयोग करेंगे। काफी कुछ: 'do.call (data.table ::: c.factor, lapply (सूची (डीटी 1, डीटी 2), "[[",' x '))' आपके परिदृश्य में – eddi

2

इस समस्या को इंगित करने के लिए धन्यवाद। है version 1.8.11 के रूप में यह निर्धारित किया गया:

dt1 <- data.table(x=factor(c("a", "b"), levels=letters)) 

rbindlist(list(dt1, dt1))[,x] 
#[1] a b a b 
#Levels: a b c d e f g h i j k l m n o p q r s t u v w x y z 
संबंधित मुद्दे