如何自动拼接非零值列名?SAS脚本适配新增事件类型
动态生成事件组合标签的SAS解决方案(无需硬编码事件类型)
太懂你这种硬编码的痛点了——新增个事件类型就得改一堆代码,完全不灵活!下面给你一套自动适配所有事件类型的方案,不管以后加多少种event_type,脚本都能自动识别并生成对应的标签:
步骤1:动态获取所有唯一事件类型,存入宏变量
这一步先把所有存在的事件类型抓出来,存到宏变量里,彻底摆脱硬编码:
proc sql noprint; select distinct event_type into :event_types separated by ' ' from test; quit; %let num_events = &sqlobs; /* 记录事件类型的总数量 */
步骤2:转置并补全缺失值(和原脚本逻辑一致,但后续处理更灵活)
proc sql; create table test2 as select distinct ID, event_dt format worddate. as event_dt, event_type, count(distinct event) as event_count from test group by ID, event_dt, event_type; quit; proc transpose data=test2 out=test3 (drop = _name_); by id event_dt; id event_type; run; proc stdize data=test3 out=test3z reponly missing=0; run;
步骤3:用数组自动拼接非零事件类型生成标签
这里用数组遍历所有事件类型列,自动把值大于0的列名拼接起来,不用再写一堆case when:
data test3_with_tag; set test3z; length tag $200; /* 可根据实际情况调整长度,确保能装下所有组合 */ array events[&num_events] &event_types.; array event_names[&num_events] $ (&event_types.); /* 存储事件类型名称 */ tag = ''; do i = 1 to &num_events.; if events[i] > 0 then do; if tag ne '' then tag = catx(' & ', tag, event_names[i]); else tag = event_names[i]; end; end; /* 处理无任何事件的情况 */ if tag = '' then tag = 'No Event'; else do; /* 单个事件时加only,多个事件时保持&连接格式 */ if index(tag, '&') = 0 then tag = catx(' ', tag, 'only'); end; drop i; run;
步骤4:按日期和标签统计ID数量
最后直接分组统计就行,逻辑简单清晰:
proc sql; create table test4 as select event_dt, tag, count(id) as ID_COUNT from test3_with_tag group by event_dt, tag; quit;
这样一来,不管以后新增多少种event_type(比如DD、EE),脚本都会自动识别并生成对应的组合标签,完全不用手动修改代码啦!
内容的提问来源于stack exchange,提问作者Ben
相关产品推荐
相关产品推荐

