在Deneb(Vega)中转换拼接患者列 实现数据集行最小化
问题场景
我正在为医院制作基于Vega的Deneb可视化报表,最多展示20位患者的每日数据。当前传入Deneb的数据集为每日一行结构,包含30列医院相关数据。由于Power BI限制无法导入两个独立数据集(医院数据、按日期/患者分行的患者数据),只能将患者姓名、体温、血压等数据分别拼接为逗号分隔的单列,维持每日一行的格式。
已通过Vega的project转换提取出日期及拼接后的患者相关列,现在需要完成两个目标:
- 将拼接列拆分为独立列(类似Excel分列功能);
- 最终转换为每日每位患者一行的窄表结构。
之前尝试用split公式把拼接字符串转成数组,再逐个提取生成列,但这种方法需要预设固定患者数量,代码非常冗长,想找更简洁的实现方案。
之前的尝试代码如下:
{ "data": [ { "name": "dataset" }, { "name": "patient_data", "source": "dataset", "transform":[ { "type": "project", "fields": ["date", "patient_names", "temperatures", "pressure_top", "pressure_bottom"] }, { "type": "formula", "expr": "split(datum.patient_names, ',')", "as": "patient_names" }, { "type": "formula", "expr": "split(datum.temperatures, ',')", "as": "temperatures" }, { "type": "formula", "expr": "datum.patient_names[0]", "as": "patient1" }, { "type": "formula", "expr": "datum.temperatures[0]", "as": "temp1" } ] } ], "marks": [] }
优化方案
可以使用Vega的flatten转换来实现自动拆分数组并生成窄表结构,无需预设患者数量,代码更简洁。具体逻辑:
- 先将所有拼接列通过
split转为数组; - 使用
flatten转换指定需要展开的数组字段,Vega会自动将每个数组元素拆分为单独一行,并对应保留原始行的其他字段(比如日期)。
优化后的完整代码示例:
{ "data": [ { "name": "dataset" }, { "name": "patient_data", "source": "dataset", "transform": [ { "type": "project", "fields": ["date", "patient_names", "temperatures", "pressure_top", "pressure_bottom"] }, // 将所有拼接字段转为数组 { "type": "formula", "expr": "split(datum.patient_names, ',')", "as": "patient_names" }, { "type": "formula", "expr": "split(datum.temperatures, ',')", "as": "temperatures" }, { "type": "formula", "expr": "split(datum.pressure_top, ',')", "as": "pressure_top" }, { "type": "formula", "expr": "split(datum.pressure_bottom, ',')", "as": "pressure_bottom" }, // 展开数组,生成每行对应一位患者的窄表 { "type": "flatten", "fields": ["patient_names", "temperatures", "pressure_top", "pressure_bottom"], "index": "patient_index" // 可选:添加患者索引字段,标记当日第几位患者 }, // 可选:将数值类型字段转为数字(如果拼接时是字符串格式) { "type": "formula", "expr": "toNumber(datum.temperatures)", "as": "temperatures" }, { "type": "formula", "expr": "toNumber(datum.pressure_top)", "as": "pressure_top" }, { "type": "formula", "expr": "toNumber(datum.pressure_bottom)", "as": "pressure_bottom" } ] } ], "marks": [] }
代码说明
flatten转换会同时展开多个数组字段,确保同一位置的数组元素对应到同一行(比如patient_names的第1个元素和temperatures的第1个元素会成为同一行数据);- 可选的
index参数会生成一个索引字段,方便标记当日患者的序号; - 最后添加
toNumber转换是因为拼接后的数值字段通常是字符串类型,转为数字后方便后续可视化计算或展示。
内容的提问来源于stack exchange,提问作者Vlad
相关产品推荐
相关产品推荐

