如何用Tcl计算数据集中样本量更大组的(X,Y)平均值?
用Tcl计算样本量更大组的(X,Y)平均值
需求说明
需要先判断数据集中哪组样本量(数据点数量)更多,再仅计算该组的(X,Y)平均值,而非整个数据集的平均(示例中橙色区域为整体平均,蓝色区域为分组平均)。
示例数据集
X Y 1 9 1.5 8.5 0.5 9.5 1.5 9.5 1 9.5 0.5 8.5 1.5 9 0.5 9 0 9 0 8.5 2 9 1.7 8.7 1.2 9.2 0.2 9.2 0.7 8.3 1 8 8.5 1.5 9.5 0.5 8.5 0.5 9 1.5 9.5 0 8 0 9 0.5
实现思路与Tcl代码
核心思路是一次遍历完成分组统计,同时记录每组的样本量、X总和、Y总和,最后比较两组样本量,计算对应组的平均值。
从示例数据和示意图来看,两组可通过X和Y的大小关系区分:一组是X偏小、Y偏大(X<5且Y>5),另一组是X偏大、Y偏小(X>5且Y<5)。你可以根据实际数据调整分组规则。
# 初始化分组统计变量 set groupA_count 0 set groupA_sumX 0.0 set groupA_sumY 0.0 set groupB_count 0 set groupB_sumX 0.0 set groupB_sumY 0.0 # 示例数据集(实际场景可从文件读取) set data { 1 9 1.5 8.5 0.5 9.5 1.5 9.5 1 9.5 0.5 8.5 1.5 9 0.5 9 0 9 0 8.5 2 9 1.7 8.7 1.2 9.2 0.2 9.2 0.7 8.3 1 8 8.5 1.5 9.5 0.5 8.5 0.5 9 1.5 9.5 0 8 0 9 0.5 } # 遍历每一行数据 foreach line [split $data "\n"] { # 跳过空行和表头 if {$line eq "" || [string match "X Y" $line]} { continue } # 拆分X和Y数值 lassign [split $line] x y # 执行分组判断(可根据实际数据调整规则) if {$x < 5 && $y > 5} { incr groupA_count set groupA_sumX [expr {$groupA_sumX + $x}] set groupA_sumY [expr {$groupA_sumY + $y}] } elseif {$x > 5 && $y < 5} { incr groupB_count set groupB_sumX [expr {$groupB_sumX + $x}] set groupB_sumY [expr {$groupB_sumY + $y}] } } # 确定样本量更大的组并计算平均值 if {$groupA_count > $groupB_count} { set avgX [expr {$groupA_sumX / $groupA_count}] set avgY [expr {$groupA_sumY / $groupA_count}] puts "样本量更大的是组A(共$groupA_count个数据点),平均值:X=[format "%.2f" $avgX], Y=[format "%.2f" $avgY]" } elseif {$groupB_count > $groupA_count} { set avgX [expr {$groupB_sumX / $groupB_count}] set avgY [expr {$groupB_sumY / $groupB_count}] puts "样本量更大的是组B(共$groupB_count个数据点),平均值:X=[format "%.2f" $avgX], Y=[format "%.2f" $avgY]" } else { set avgA_X [expr {$groupA_sumX/$groupA_count}] set avgA_Y [expr {$groupA_sumY/$groupA_count}] set avgB_X [expr {$groupB_sumX/$groupB_count}] set avgB_Y [expr {$groupB_sumY/$groupB_count}] puts "两组样本量相同,组A平均值:X=[format "%.2f" $avgA_X], Y=[format "%.2f" $avgA_Y];组B平均值:X=[format "%.2f" $avgB_X], Y=[format "%.2f" $avgB_Y]" }
代码说明
- 一次遍历完成计数与累加,避免重复遍历提升效率;
- 分组规则可灵活调整(比如聚类逻辑、其他阈值判断);
- 用
format "%.2f"控制平均值小数位数,按需调整精度; - 处理了两组样本量相同的边界情况,避免逻辑遗漏。
内容的提问来源于stack exchange,提问作者Kuo-Hsien Chang
相关产品推荐
相关产品推荐

