SAS中visit分组存在多行情景下 拼接week字段生成visit(week)列
SAS按分组聚合拼接visit与week字段实现方案
直接按分组统计后按规则拼接即可,实现逻辑分三步:
- 先预处理week字段,提取w后缀的数值,方便后续统计最值、判断非空数量
- 按
group_id+visit双字段分组,聚合计算每组非空week的个数、最小周数、最大周数 - 按给定的匹配规则拼接生成目标字段即可
完整可运行代码如下:
/* 1. 预处理week字段,提取数值型周数 */ data preprocess; set have; if not missing(week) then week_num = input(substr(week, 2), best.); else week_num = .; run; /* 2. 分组聚合统计周数相关指标 */ proc summary data=preprocess nway; class group_id visit; var week_num; output out=agg_res (drop=_type_ _freq_) n=non_empty_week_cnt min=min_wk max=max_wk; run; /* 3. 按规则生成目标字段,输出最终结果 */ data want; set agg_res; length visit_week $30.; if non_empty_week_cnt = 0 then do; /* 无有效week,直接返回原visit值 */ visit_week = visit; end; else if non_empty_week_cnt = 1 then do; /* 单个非空week,拼接为vX(wX)格式 */ visit_week = catt(visit, "(w", min_wk, ")"); end; else do; /* 多个连续week,拼接为vX(wmin-wmax)格式 */ visit_week = catt(visit, "(w", min_wk, "-w", max_wk, ")"); end; rename visit_week = 'visit(week)'n; drop non_empty_week_cnt min_wk max_wk; run;
上述代码生成的
want数据集和给出的预期输出完全一致。如果后续存在同visit下week不连续需要单独枚举的场景,只需要在第三步加周数间隔判断分支即可,当前测试数据场景下无需额外处理。
内容的提问来源于stack exchange,提问作者Robin
相关产品推荐
相关产品推荐

