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

如何在CATX函数中一次性添加所有列,无需逐个手动指定?

SAS按ID聚合生成LINESTRING格式坐标列

现有数据集

WORK.TEMP_PTCAR_1的创建代码如下:

data WORK.TEMP_PTCAR_1;
 input ID $ COORDINATES $ 5-7;
 cards;
ID1 1 5 
ID1 4 8 
ID1 8 7 
ID2 3 4 
ID2 9 2
;
run;

期望输出

按ID聚合后,COORDINATES列以LINESTRING格式存储所有坐标对:

IDCOORDINATES
ID1LINESTRING(1 5, 4 8, 8 7)
ID2LINESTRING(3 4, 9 2)

已尝试的问题点

通过PROC TRANSPOSE转置数据后,需要手动指定所有转置生成的列(如XY1、XY2等)来拼接LINESTRING,无法自动适配不同ID下的行数差异。

解决方案:直接用DATA步BY组动态拼接

无需转置,直接在DATA步中利用BY组逻辑,动态拼接每个ID下的所有坐标对:

data WORK.TEMP_PTCAR_FINAL;
    length COORDINATES $ 200; /* 根据实际数据调整长度 */
    retain coords_list; /* 保留拼接中的坐标列表 */
    set WORK.TEMP_PTCAR_1;
    by ID;
    
    /* 初始化当前ID的坐标列表 */
    if first.ID then do;
        coords_list = COORDINATES;
    end;
    /* 追加后续坐标对 */
    else do;
        coords_list = catx(", ", coords_list, COORDINATES);
    end;
    
    /* 处理完当前ID的所有行后,生成LINESTRING格式并输出 */
    if last.ID then do;
        COORDINATES = cats("LINESTRING(", coords_list, ")");
        output;
        call missing(coords_list); /* 清空变量,避免影响下一个ID */
    end;
    drop coords_list; /* 移除临时变量 */
run;

方法优势

  • 无需转置操作,流程更简洁
  • 自动适配每个ID的行数,无需手动指定列名
  • 通过retain和BY组的first.ID/last.ID逻辑,高效完成聚合拼接

内容的提问来源于stack exchange,提问作者Andy De Vos

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 04:57:20