Mathematica:列表上的条件操作

500*_*500 4 conditional loops wolfram-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}}
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

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

所以这里:Col 1的平均值= 1和Col 1 = 2

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

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

LA

输出理想格式:

在此输入图像描述

Mr.*_*ard 5

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

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

ArrayFlatten[{{e, %}}] // TableForm
Run Code Online (Sandbox Code Playgroud)

要获得舍入则只需添加Round@之前Mean在上面的代码: Round@Mean@#2

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

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

ArrayFlatten[{{e, e[[All, {1}]] /. %}}] // TableForm
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

Table[RandomInteger[{1, 100}], {20}]RandomInteger[{1, 100}, 20]

Join[{c}, {d}] // TransposeTranspose[{c, d}].