You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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转换来实现自动拆分数组并生成窄表结构,无需预设患者数量,代码更简洁。具体逻辑:

  1. 先将所有拼接列通过split转为数组;
  2. 使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 04:47:12