如何通过Vega Transform添加列存储各州竞赛奖牌总数?
问题
我有一个数据集,每行代表某州在竞赛中获得的一枚奖牌,现在想转换数据来制作堆叠条形图。用aggregate transform能轻松拿到各州奖牌总数或各类型(金、银、铜)奖牌数,但我需要给数据集加一列,存储对应州的总奖牌数,让每个州的金、银、铜奖牌数据行都带上这个总数。
数据集示例(表头及前5行)
medal,beer_name,brewery,city,state,category,year,id Gold,Volksbier Vienna,Wibby Brewing,Longmont,CO,American Amber Lager,2020,8 Silver,Oktoberfest,Founders Brewing Co.,Grand Rapids,MI,American Amber Lager,2020,26 Bronze,Amber Lager,Skipping Rock Beer Co.,Staunton,VA,American Amber Lager,2020,51 Gold,Lager at World's End,Epidemic Ales,Concord,CA,American Lager,2020,6 Silver,Seismic Tremor,Seismic Brewing Co.,Santa Rosa,CA,American Lager,2020,6
我尝试的代码
transform: [ { type: "aggregate", groupby: ["state","medal"] }, { type: "collect", sort: { field: ["state"], order: ["ascending"] } }, { // 这是需要修改的transform type: "aggregate", groupby: ["state","medal"], fields: ["count"], ops: ["sum"], as: ["total_medals"] } ]
解决方案
你需要分两步聚合并关联数据,先计算每个州的总奖牌数,再把这个总数合并回按state+medal分组的数据里。调整后的transform如下:
transform: [ // 第一步:按state+medal分组,统计各类型奖牌数量 { type: "aggregate", groupby: ["state", "medal"], ops: ["count"], as: ["medal_count"] }, // 第二步:计算每个州的总奖牌数,生成临时数据集 { type: "aggregate", groupby: ["state"], fields: ["medal_count"], ops: ["sum"], as: ["total_medals"], as: "state_totals" }, // 第三步:将原分组数据和州总奖牌数按state关联 { type: "lookup", from: "state_totals", key: "state", fields: ["state"], values: ["total_medals"] }, // 可选:按州名升序排序 { type: "collect", sort: { field: ["state"], order: ["ascending"] } } ]
步骤说明
- 第一次聚合:按
state和medal分组,统计每个州每种奖牌的数量,得到medal_count列。 - 第二次聚合:单独按
state分组,求和得到每个州的总奖牌数total_medals,并用as参数将结果存为临时数据集state_totals。 - lookup关联:把第一次聚合的结果和
state_totals通过state字段匹配,给每一行添加上对应州的总奖牌数。 - 排序(可选):按州名升序排列数据,方便后续可视化。
处理后,每个州的金、银、铜奖牌数据行都会带上该州的总奖牌数,完全满足堆叠条形图的数据需求。
内容的提问来源于stack exchange,提问作者Nick5741
相关产品推荐
相关产品推荐

