type
Post
status
Published
date
Jan 7, 2023
slug
wolfram-sz4
summary
tags
mathematica
category
学习思考
icon
password
Property
Jan 10, 2023 07:40 AM
URL
dataABC = { {"a", 1, 2, 3}, {"b", 1, 3, 5}, {"c", 1, 2, 1}, {"a", 1, 2, 3}, {"a", 1, 1, 1}, {"c", 1, 1, 1}, {"b", 2, 2, 2} };
可以看到 a ,b ,c 后面有三个值,我们现在想求这些值的平均值,类似于下面这样的,求平均值

FlattenAt[#, -1] & /@ (List @@@ Normal@GroupBy[dataABC, First -> Rest, Mean])
使用
GroupBy
函数,可以将相同的开头用 Key 来关联,如下所示GroupBy[{{a, b}, {a, c}, {b, c}}, First]
<|a -> {{a, b}, {a, c}}, b -> {{b, c}}|>
借用这个思想,首先用
GroupBy[dataABC, First]
就能将相同的字母开头的收集起来下面这个实例是 按第一个元素分组 并 计算相应的最后元素的平均值:
GroupBy[{{a, x}, {b, v}, {a, y}, {a, z}, {b, w}}, First -> Last, Mean]
我们用于此就成了
GroupBy[dataABC, First -> Rest, Mean]
<|"a" -> {1, 5/3, 7/3}, "b" -> {3/2, 5/2, 7/2}, "c" -> {1, 3/2, 1}|>
但是这样不符合我们的要求,最后的表达式形式是
{字母,数字,数字,数字}
,所以使用 Normal 函数转换一下,将上面的关联转换成列表Normal@GroupBy[dataABC, First -> Rest, Mean]
{"a" -> {1, 5/3, 7/3}, "b" -> {3/2, 5/2, 7/2}, "c" -> {1, 3/2, 1}}
再使用
List@@@
替换 Head ,这样就能变成列表的形式List@@@Normal@GroupBy[dataABC, First -> Rest, Mean]
{{"a", {1, 5/3, 7/3}}, {"b", {3/2, 5/2, 7/2}}, {"c", {1, 3/2, 1}}}
最后使用 FlattenAt 函数将上面的列表中的最后一个子列表都压平
FlattenAt[#, -1] & /@ (List @@@ Normal@GroupBy[dataABC, First -> Rest, Mean])
{{"a", 1, 5/3, 7/3}, {"b", 3/2, 5/2, 7/2}, {"c", 1, 3/2, 1}}
- 作者:我心永恒
- 链接:https://wxyhgk.com/article%2Fwolfram-sz4
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。