如何在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格式存储所有坐标对:
| ID | COORDINATES |
|---|---|
| ID1 | LINESTRING(1 5, 4 8, 8 7) |
| ID2 | LINESTRING(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
相关产品推荐
相关产品推荐

