【问题标题】:Creating a histogram function创建直方图函数
【发布时间】:2023-03-12 01:50:01
【问题描述】:

假设我有一个这种形式的数组

[
   [val1,val2,val3],
   [val4,val2,val1]
   ....
]

更新-对不起,我对我的要求不太清楚。我的意思是这个

输出应该是这样的对象数组

[ {[val1,val2,val3] : 1}, {[val4,val2,val1] : 1}],

我刚刚意识到,上面的 json 非常愚蠢,我认为创建这样的对象更有意义

{ selectedRowIndices: [rows that have the value], freq: the frequency}

我想到了下划线并使用它的 groupBy 函数,实际上,使用简单的数组成功地做到了这一点,使用

groups = _(values)
  .chain()
  .groupBy(_.identity)
  .map((values, key) ->
    freq: values.length
    value: key
  ).sortBy((d) ->
    d.value
  ).value()

但是,我不确定如何使用上述数组。

【问题讨论】:

  • 先展平阵列? underscorejs.org/#flatten。由于您使用 JavaScript 处理数据,因此您的问题与 JSON 无关。
  • 那不知道是不是在处理第三栏的东西?
  • 你要.groupBy((d)->d[2])吗?
  • 哦,我现在明白了。嗯,这是最简单的方法,你遍历外部数组并将每个内部数组的第三个元素放入一个新数组中。
  • 如果您在第三列中有两个具有相同值的数组,例如[ [val2,val3,val1], [val4,val5,val1] ],该怎么办?并注意数组不是键(必须是字符串)

标签: javascript coffeescript underscore.js


【解决方案1】:

还有一个更简单的函数可以创建直方图:countBy。如果您不想按身份分组,而是按每个数组的第三项分组,则可以编写

_.countBy( (a) -> a[2] )

【讨论】:

  • 但我想按每个数组第三项的出现次数分组
  • 你的意思是_.groupBy(values, (a) -> _.reduce(a, (m, v)->m+(v==a[2]), 0) )
  • @praks5432:我明白了,需要换行。 coffeescript.org/…
【解决方案2】:

我想你正在寻找

groups = _.chain(values)
  .groupBy((a) ->
    a[2]
  ).map((values, key) ->
    value: key // the third column
    selectedRows: values // the rows that have this value
    freq: values.length // and their number
  ).sortBy((d) ->
    d.value
  ).value()

如果您需要索引,请将 groupBy 调用替换为

  .reduce((m, a, i) ->
    k = a[2]
    (m[k] || m[k]=[]).push i // instead of pushing `a`
    m
   , {})

【讨论】:

  • 甜美,看起来它有效 - 有没有办法获取行的索引而不是 selectedRows 中的实际行?
  • 您需要使用group function 来推送index 而不是value
猜你喜欢
  • 2017-02-04
  • 2015-02-10
  • 1970-01-01
  • 1970-01-01
  • 2012-02-17
  • 2017-11-11
  • 2017-07-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多