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
输出理想格式:

有趣的问题.这是我想到的第一件事:
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}] // Transpose与Transpose[{c, d}].