发布日期:2023-1-7 更新日期: 2023-1-10文章字数 0阅读时长:0分钟

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 后面有三个值,我们现在想求这些值的平均值,类似于下面这样的,求平均值
notion image
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}}

Docker 搭建自动学习强国 Docker 搭建自动学习强国