2011-03-30 11 views

Respuesta

5

Utilice la macro $.

=> (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

Es cierto tipo de ($: la ficha) es LazySeq, pero al pedir más de una columna, e. gramo. ($: todos los datos) es Dataset. ¿Hay alguna manera de obtener una secuencia de columnas cuando se solicita más de una? – 0dB

2

Al buscar el código fuente para to-vect se usa map para generar el resultado, que ya proporciona un grado de pereza. Desafortunadamente, parece que todo el conjunto de datos se convierte primero toArray, probablemente solo regalando todos los beneficios de map lazyness.

Si quiere más, probablemente tenga que sumergirse en los detalles sangrientos del Java object manteniendo efectivamente la versión matricial del conjunto de datos y escribir su propia versión de vect.

1

Puede usar la estructura interna del conjunto de datos.

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)) 

Aunque no estoy seguro de hasta qué punto la estructura interna es API pública. Probablemente deberías comprobar eso con los muchachos de incanter.

Cuestiones relacionadas