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
Clojure/dataset:按多个列分层分组?_Clojure_Group By_Dataset - Fatal编程技术网

Clojure/dataset:按多个列分层分组?

Clojure/dataset:按多个列分层分组?,clojure,group-by,dataset,Clojure,Group By,Dataset,我想实现一个函数,它可以按层次结构对多个列进行分组。我可以通过以下两列的暂定实现来说明我的需求: (defn group-by-two-columns-hierarchically [col1 col2 table] (let [data-by-col1 ($group-by col1 table) data-further-by-col2 (into {} (for [[k v] data-by-col1] [k ($group-by col2 v)]))

我想实现一个函数,它可以按层次结构对多个列进行分组。我可以通过以下两列的暂定实现来说明我的需求:

(defn group-by-two-columns-hierarchically
  [col1 col2 table]
  (let [data-by-col1 ($group-by col1 table)
        data-further-by-col2 (into {} (for [[k v] data-by-col1] [k ($group-by col2 v)]))
        ]
    data-further-by-col2
    ))
我正在寻求关于如何对任意数量的列进行概括的帮助

(我知道Incater支持对多列进行分组,但它只提供了一种结构而不是层次结构,即多列的复合键到数据集值的映射。)

谢谢你的帮助

注:要使Michał的解决方案适用于白炽灯数据集,只需稍作修改,将“group by”替换为“incater.core/$group by”,如下实验所示:

(defn group-by*
      "Similar to group-by, but takes a collection of functions and returns
      a hierarchically grouped result."
      [fs coll]
      (if-let [f (first fs)]
        (into {} (map (fn [[k vs]]
                        [k (group-by* (next fs) vs)])
                   (incanter.core/$group-by f coll)))
        coll))

(def table (incanter.core/dataset ["x1" "x2" "x3"]
                                      [[1 2 3]
                                       [1 2 30]
                                       [4 5 6]
                                       [4 5 60]
                                       [7 8 9]
                                       ]))


(group-by* [:x1 :x2] table)
=>
    {{:x1 1} {{:x2 2} 
        | x1 | x2 | x3 |
        |----+----+----|
        |  1 |  2 |  3 |
        |  1 |  2 | 30 |
        }, 
    {:x1 4} {{:x2 5} 
        | x1 | x2 | x3 |
        |----+----+----|
        |  4 |  5 |  6 |
        |  4 |  5 | 60 |
        }, 
    {:x1 7} {{:x2 8} 
        | x1 | x2 | x3 |
        |----+----+----|
        |  7 |  8 |  9 |
        }}
例如:

user> (group-by* [:foo :bar :quux]
        [{:foo 1 :bar 1 :quux 1 :asdf 1}
         {:foo 1 :bar 1 :quux 2 :asdf 2}
         {:foo 1 :bar 2 :quux 1 :asdf 3}
         {:foo 1 :bar 2 :quux 2 :asdf 4}
         {:foo 2 :bar 1 :quux 1 :asdf 5}
         {:foo 2 :bar 1 :quux 2 :asdf 6}
         {:foo 2 :bar 2 :quux 1 :asdf 7}
         {:foo 2 :bar 2 :quux 2 :asdf 8}
         {:foo 1 :bar 1 :quux 1 :asdf 9}
         {:foo 1 :bar 1 :quux 2 :asdf 10}
         {:foo 1 :bar 2 :quux 1 :asdf 11}
         {:foo 1 :bar 2 :quux 2 :asdf 12}
         {:foo 2 :bar 1 :quux 1 :asdf 13}
         {:foo 2 :bar 1 :quux 2 :asdf 14}
         {:foo 2 :bar 2 :quux 1 :asdf 15}
         {:foo 2 :bar 2 :quux 2 :asdf 16}])
{1 {1 {1 [{:asdf 1, :bar 1, :foo 1, :quux 1}
          {:asdf 9, :bar 1, :foo 1, :quux 1}],
       2 [{:asdf 2, :bar 1, :foo 1, :quux 2}
          {:asdf 10, :bar 1, :foo 1, :quux 2}]},
    2 {1 [{:asdf 3, :bar 2, :foo 1, :quux 1}
          {:asdf 11, :bar 2, :foo 1, :quux 1}],
       2 [{:asdf 4, :bar 2, :foo 1, :quux 2}
          {:asdf 12, :bar 2, :foo 1, :quux 2}]}},
 2 {1 {1 [{:asdf 5, :bar 1, :foo 2, :quux 1}
          {:asdf 13, :bar 1, :foo 2, :quux 1}],
       2 [{:asdf 6, :bar 1, :foo 2, :quux 2}
          {:asdf 14, :bar 1, :foo 2, :quux 2}]},
    2 {1 [{:asdf 7, :bar 2, :foo 2, :quux 1}
          {:asdf 15, :bar 2, :foo 2, :quux 1}],
       2 [{:asdf 8, :bar 2, :foo 2, :quux 2}
          {:asdf 16, :bar 2, :foo 2, :quux 2}]}}}
例如:

user> (group-by* [:foo :bar :quux]
        [{:foo 1 :bar 1 :quux 1 :asdf 1}
         {:foo 1 :bar 1 :quux 2 :asdf 2}
         {:foo 1 :bar 2 :quux 1 :asdf 3}
         {:foo 1 :bar 2 :quux 2 :asdf 4}
         {:foo 2 :bar 1 :quux 1 :asdf 5}
         {:foo 2 :bar 1 :quux 2 :asdf 6}
         {:foo 2 :bar 2 :quux 1 :asdf 7}
         {:foo 2 :bar 2 :quux 2 :asdf 8}
         {:foo 1 :bar 1 :quux 1 :asdf 9}
         {:foo 1 :bar 1 :quux 2 :asdf 10}
         {:foo 1 :bar 2 :quux 1 :asdf 11}
         {:foo 1 :bar 2 :quux 2 :asdf 12}
         {:foo 2 :bar 1 :quux 1 :asdf 13}
         {:foo 2 :bar 1 :quux 2 :asdf 14}
         {:foo 2 :bar 2 :quux 1 :asdf 15}
         {:foo 2 :bar 2 :quux 2 :asdf 16}])
{1 {1 {1 [{:asdf 1, :bar 1, :foo 1, :quux 1}
          {:asdf 9, :bar 1, :foo 1, :quux 1}],
       2 [{:asdf 2, :bar 1, :foo 1, :quux 2}
          {:asdf 10, :bar 1, :foo 1, :quux 2}]},
    2 {1 [{:asdf 3, :bar 2, :foo 1, :quux 1}
          {:asdf 11, :bar 2, :foo 1, :quux 1}],
       2 [{:asdf 4, :bar 2, :foo 1, :quux 2}
          {:asdf 12, :bar 2, :foo 1, :quux 2}]}},
 2 {1 {1 [{:asdf 5, :bar 1, :foo 2, :quux 1}
          {:asdf 13, :bar 1, :foo 2, :quux 1}],
       2 [{:asdf 6, :bar 1, :foo 2, :quux 2}
          {:asdf 14, :bar 1, :foo 2, :quux 2}]},
    2 {1 [{:asdf 7, :bar 2, :foo 2, :quux 1}
          {:asdf 15, :bar 2, :foo 2, :quux 1}],
       2 [{:asdf 8, :bar 2, :foo 2, :quux 2}
          {:asdf 16, :bar 2, :foo 2, :quux 2}]}}}
例如:

user> (group-by* [:foo :bar :quux]
        [{:foo 1 :bar 1 :quux 1 :asdf 1}
         {:foo 1 :bar 1 :quux 2 :asdf 2}
         {:foo 1 :bar 2 :quux 1 :asdf 3}
         {:foo 1 :bar 2 :quux 2 :asdf 4}
         {:foo 2 :bar 1 :quux 1 :asdf 5}
         {:foo 2 :bar 1 :quux 2 :asdf 6}
         {:foo 2 :bar 2 :quux 1 :asdf 7}
         {:foo 2 :bar 2 :quux 2 :asdf 8}
         {:foo 1 :bar 1 :quux 1 :asdf 9}
         {:foo 1 :bar 1 :quux 2 :asdf 10}
         {:foo 1 :bar 2 :quux 1 :asdf 11}
         {:foo 1 :bar 2 :quux 2 :asdf 12}
         {:foo 2 :bar 1 :quux 1 :asdf 13}
         {:foo 2 :bar 1 :quux 2 :asdf 14}
         {:foo 2 :bar 2 :quux 1 :asdf 15}
         {:foo 2 :bar 2 :quux 2 :asdf 16}])
{1 {1 {1 [{:asdf 1, :bar 1, :foo 1, :quux 1}
          {:asdf 9, :bar 1, :foo 1, :quux 1}],
       2 [{:asdf 2, :bar 1, :foo 1, :quux 2}
          {:asdf 10, :bar 1, :foo 1, :quux 2}]},
    2 {1 [{:asdf 3, :bar 2, :foo 1, :quux 1}
          {:asdf 11, :bar 2, :foo 1, :quux 1}],
       2 [{:asdf 4, :bar 2, :foo 1, :quux 2}
          {:asdf 12, :bar 2, :foo 1, :quux 2}]}},
 2 {1 {1 [{:asdf 5, :bar 1, :foo 2, :quux 1}
          {:asdf 13, :bar 1, :foo 2, :quux 1}],
       2 [{:asdf 6, :bar 1, :foo 2, :quux 2}
          {:asdf 14, :bar 1, :foo 2, :quux 2}]},
    2 {1 [{:asdf 7, :bar 2, :foo 2, :quux 1}
          {:asdf 15, :bar 2, :foo 2, :quux 1}],
       2 [{:asdf 8, :bar 2, :foo 2, :quux 2}
          {:asdf 16, :bar 2, :foo 2, :quux 2}]}}}
例如:

user> (group-by* [:foo :bar :quux]
        [{:foo 1 :bar 1 :quux 1 :asdf 1}
         {:foo 1 :bar 1 :quux 2 :asdf 2}
         {:foo 1 :bar 2 :quux 1 :asdf 3}
         {:foo 1 :bar 2 :quux 2 :asdf 4}
         {:foo 2 :bar 1 :quux 1 :asdf 5}
         {:foo 2 :bar 1 :quux 2 :asdf 6}
         {:foo 2 :bar 2 :quux 1 :asdf 7}
         {:foo 2 :bar 2 :quux 2 :asdf 8}
         {:foo 1 :bar 1 :quux 1 :asdf 9}
         {:foo 1 :bar 1 :quux 2 :asdf 10}
         {:foo 1 :bar 2 :quux 1 :asdf 11}
         {:foo 1 :bar 2 :quux 2 :asdf 12}
         {:foo 2 :bar 1 :quux 1 :asdf 13}
         {:foo 2 :bar 1 :quux 2 :asdf 14}
         {:foo 2 :bar 2 :quux 1 :asdf 15}
         {:foo 2 :bar 2 :quux 2 :asdf 16}])
{1 {1 {1 [{:asdf 1, :bar 1, :foo 1, :quux 1}
          {:asdf 9, :bar 1, :foo 1, :quux 1}],
       2 [{:asdf 2, :bar 1, :foo 1, :quux 2}
          {:asdf 10, :bar 1, :foo 1, :quux 2}]},
    2 {1 [{:asdf 3, :bar 2, :foo 1, :quux 1}
          {:asdf 11, :bar 2, :foo 1, :quux 1}],
       2 [{:asdf 4, :bar 2, :foo 1, :quux 2}
          {:asdf 12, :bar 2, :foo 1, :quux 2}]}},
 2 {1 {1 [{:asdf 5, :bar 1, :foo 2, :quux 1}
          {:asdf 13, :bar 1, :foo 2, :quux 1}],
       2 [{:asdf 6, :bar 1, :foo 2, :quux 2}
          {:asdf 14, :bar 1, :foo 2, :quux 2}]},
    2 {1 [{:asdf 7, :bar 2, :foo 2, :quux 1}
          {:asdf 15, :bar 2, :foo 2, :quux 1}],
       2 [{:asdf 8, :bar 2, :foo 2, :quux 2}
          {:asdf 16, :bar 2, :foo 2, :quux 2}]}}}

迈克尔,非常感谢!为了从代码格式化支持中获益,我不得不编辑我的问题,以确认您的解决方案适用于incater/dataset.Michal,非常感谢!为了从代码格式化支持中获益,我不得不编辑我的问题,以确认您的解决方案适用于incater/dataset.Michal,非常感谢!为了从代码格式化支持中获益,我不得不编辑我的问题,以确认您的解决方案适用于incater/dataset.Michal,非常感谢!为了从代码格式化支持中获益,我必须编辑我的问题以确认您的解决方案适用于白炽灯/数据集。