Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure 如何修改白炽灯数据集中的列?_Clojure_Incanter - Fatal编程技术网

Clojure 如何修改白炽灯数据集中的列?

Clojure 如何修改白炽灯数据集中的列?,clojure,incanter,Clojure,Incanter,我希望能够转换白炽灯数据集中的单个列,并将生成的数据集保存到新的(csv)文件中。最简单的方法是什么 基本上,我希望能够将函数映射到数据集中的列上,并用此结果替换原始列。您可以定义如下内容: (defn map-data [dataset column fn] (conj-cols (sel dataset :except-cols column) ($map fn column dataset))) 并用作 (def data (get-dataset :car

我希望能够转换白炽灯数据集中的单个列,并将生成的数据集保存到新的(csv)文件中。最简单的方法是什么


基本上,我希望能够将函数映射到数据集中的列上,并用此结果替换原始列。

您可以定义如下内容:

(defn map-data [dataset column fn]
  (conj-cols (sel dataset :except-cols column)
             ($map fn column dataset)))
并用作

(def data (get-dataset :cars))
(map-data data :speed #(* % 2))

更改列名只有一个问题-我会在有空闲时间时尝试解决它…

再说一遍:也许您可以使用数据集的内部结构

user=> (defn update-column
         [dataset column f & args]
         (->> (map #(apply update-in % [column] f args) (:rows dataset))
           vec
           (assoc dataset :rows)))
#'user/update-column
user=> d
[:col-0 :col-1]
[1 2]
[3 4]
[5 6]

user=> (update-column d :col-1 str "d")
[:col-0 :col-1]
[1 "2d"]
[3 "4d"]
[5 "6d"]

同样,应该检查这是公共API有多远。

这里有两个类似的函数,都是列名和顺序保留函数

(defn transform-column [col-name f data] 
  (let [new-col-names (sort-by #(= % col-name) (col-names data))
        new-dataset (conj-cols
                      (sel data :except-cols col-name)
                      (f ($ col-name data)))]

    ($ (col-names data) (col-names new-dataset new-col-names) )))

(defn transform-rows [col-name f data] 
  (let [new-col-names (sort-by #(= % col-name) (col-names data))
        new-dataset (conj-cols
                      (sel data :except-cols col-name)
                      ($map f col-name data))]
下面是一个例子,说明了两者的区别:

=> (def test-data (to-dataset [{:a 1 :b 2} {:a 3 :b 4}])) 
=> (transform-column :a (fn [x] (map #(* % 2) x)) test-data)
[:a :b]
[2 2]
[6 4]

=> (transform-rows   :a #(* % 2) test-data)
[:a :b]
[2 2]
[6 4]
transform rows
最适合于简单转换,其中as
transform column
适用于一行的转换依赖于其他行的情况(例如,在规范化列时)

可以使用标准白炽灯功能保存和加载CSV,因此完整示例如下所示:

(use '(incanter core io)))

(def data (col-names (read-dataset 'data.csv') [:a :b])

(save (transform-rows :a #(* % 2) data) 'transformed-data.csv')
注意:此解决方案需要白炽灯1.5.3或更高版本

对于那些谁可以使用最新版本的白炽灯

&在1.5.3中添加到白炽灯中

从文档中:

将具有给定值的列添加到数据集中

或者您可以使用:

“此函数向数据集添加一列,该数据集是的函数 现有列。如果未提供数据集,$data(由 与数据宏)一起使用。f应是 从列中,参数按该顺序排列。“

一个更完整的例子

(use '(incanter core datasets))
  (def cars (get-dataset :cars))

(add-derived-column :dist-over-speed [:dist :speed] (fn [d s] (/ d s)) cars)

(with-data (get-dataset :cars)
  (view (add-derived-column :speed**-1 [:speed] #(/ 1.0 %))))

是的,也许它会更优化,尽管在数据集上添加相应的操作可能更好。该解决方案的优点是它可以适应每一行都是关联数据结构、映射或序列的情况。
(add-column column-name values data)
(add-derived-column column-name from-columns f)
(add-derived-column column-name from-columns f data)
(use '(incanter core datasets))
  (def cars (get-dataset :cars))

(add-derived-column :dist-over-speed [:dist :speed] (fn [d s] (/ d s)) cars)

(with-data (get-dataset :cars)
  (view (add-derived-column :speed**-1 [:speed] #(/ 1.0 %))))