循环 – Mathematica:列表上的条件操作

我希望在一列中对“行”进行平均.这是在另一列中具有相同值的行.

例如 :

e= {{1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2}, 
   {69, 7, 30, 38, 16, 70, 97, 50, 97, 31, 81, 96, 60, 52, 35, 6, 
    24, 65, 76, 100}}

我想平均第二列中与第一列中具有相同值的所有值.

所以这里:Col 1的平均值= 1&第1栏= 2

然后使用此操作的结果创建第三列.因此,对于接下来的10行中的前10行,该列中的值应该相同.

非常感谢您提供的任何帮助!

LA

输出理想格式:

有趣的问题.这是我想到的第一件事:

e[[All, {1}]] /. Reap[Sow[#2, #] & @@@ e, _, # -> Mean@#2 &][[2]];

ArrayFlatten[{{e, %}}] // TableForm

为了得到四舍五入,您可以在上面的代码中简单地在Mean之前添加Round @:Round @ Mean @#2

这是一个稍微快一点的方法,但我实际上更喜欢上面的Sow / Reap:

#[[1, 1]] -> Round@Mean@#[[All, 2]] & /@ GatherBy[e, First];

ArrayFlatten[{{e, e[[All, {1}]] /. %}}] // TableForm

如果第一列中有许多不同的元素,则可以在替换(/.)完成之前将Dispatch应用于生成的规则列表,从而加快上述任一解决方案.此命令告诉Mathematica为规则列表构建和使用优化的内部格式.

这是一个较慢的变体,但我还是喜欢分享它:

Module[{q},
  Reap[{#, Sow[#2,#], q@#} & @@@ e, _, (q@# = Mean@#2) &][[1]]
]

另外,一般提示,你可以替换:

表[RandomInteger [{1,100}],{20}]与RandomInteger [{1,100},20]

并加入[{c},{d}] // Transpose with Transpose [{c,d}].

相关文章
相关标签/搜索