2011-03-30 12 views
5

इंकेंटर डेटा सेट से कॉलम का अनुक्रम (वैक्टर या जो कुछ भी) प्राप्त करने का सबसे अच्छा तरीका क्या है?एक incanter डेटासेट से कॉलम के अनुक्रम प्राप्त करने के लिए बेवकूफ तरीका क्या है?

मैं के बारे में सोचा:

(to-vect (trans (to-matrix my-dataset))) 

लेकिन आदर्श रूप में, मैं एक आलसी अनुक्रम चाहते हैं। क्या कोई बेहतर तरीका है?

उत्तर

5

$ मैक्रो का उपयोग करें।

=> (def data (to-dataset [{:a 1 :b 2} {:a 3 :b 4}])) 
=> ($ :a data) ;; :a column 
=> ($ 0 :all data) ;; first row 

=> (type ($ :a data)) 
clojure.lang.LazySeq 
+0

सच है, ($: डेटा) का प्रकार LazySeq है, लेकिन एक से अधिक कॉलम के लिए पूछते समय, ई। जी। ($: सभी डेटा) यह डेटासेट है। क्या कॉलम का अनुक्रम प्राप्त करने का कोई तरीका है जब एक से अधिक पूछा जाता है? – 0dB

2

to-vect के लिए स्रोत कोड को देखते हुए यह परिणाम बनाने के लिए map का उपयोग करता है, जो पहले से ही आलसी आंशिकता प्रदान कर रहा है। दुर्भाग्यवश, ऐसा लगता है कि पूरे डेटा सेट को पहले toArray रूपांतरित कर दिया गया है, शायद map आलसीता के सभी लाभों को छोड़ दें।

यदि आप और चाहते हैं, तो आपको शायद Java object के डेटा विवरण के मैट्रिक्स संस्करण को प्रभावी रूप से पकड़ने और अपने स्वयं के संस्करण को लिखने के लिए गोताखोरी विवरण में गोता लगाने की आवश्यकता है।

1

आप डेटासेट की आंतरिक संरचना का उपयोग कर सकते हैं।

user=> (use 'incanter.core) 
nil 
user=> (def d (to-dataset [{:a 1 :b 2} {:a 3 :b 4}])) 
#'user/d 
user=> (:column-names d) 
[:a :b] 
user=> (:rows d) 
[{:a 1, :b 2} {:a 3, :b 4}] 
user=> (defn columns-of 
     [dataset] 
     (for [column (:column-names dataset)] 
      (map #(get % column) (:rows dataset)))) 
#'user/columns-of 
user=> (columns-of d) 
((1 3) (2 4)) 

हालांकि मुझे यकीन नहीं है कि आंतरिक संरचना सार्वजनिक एपीआई कितनी दूर है। आपको शायद इनकेंटर लोगों के साथ जांच करनी चाहिए।

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

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