首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何修改Incanter数据集中的列?

如何修改Incanter数据集中的列?
EN

Stack Overflow用户
提问于 2011-03-30 12:11:43
回答 4查看 2.1K关注 0票数 8

我希望能够转换incanter数据集中的单个列,并将结果数据集保存到新的(csv)文件。最简单的方法是什么?

从本质上讲,我希望能够在数据集中的列上映射函数,并用这个结果替换原始的列。

EN

回答 4

Stack Overflow用户

发布于 2011-03-30 17:17:06

您可以定义如下内容:

代码语言:javascript
复制
(defn map-data [dataset column fn]
  (conj-cols (sel dataset :except-cols column)
             ($map fn column dataset)))

,并用作

代码语言:javascript
复制
(def data (get-dataset :cars))
(map-data data :speed #(* % 2))

更改列名只有一个问题-当我有空闲时间时,我会尝试修复它。

票数 5
EN

Stack Overflow用户

发布于 2011-08-03 12:38:55

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

代码语言:javascript
复制
(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))]

这里有一个例子说明了其中的区别:

代码语言:javascript
复制
=> (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可以使用标准的Incanter函数完成,因此完整的示例如下所示:

代码语言:javascript
复制
(use '(incanter core io)))

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

(save (transform-rows :a #(* % 2) data) 'transformed-data.csv')
票数 5
EN

Stack Overflow用户

发布于 2011-03-30 23:09:17

再说一次:也许你可以使用数据集的内部结构。

代码语言:javascript
复制
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。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5481777

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档