SAS数组条件判断问题:如何按年份生成正确的二元标识变量
问题分析与解决方案
错误原因
你的代码核心问题是没有利用数组索引与目标年份的对应关系:循环中对每个yr(i)都执行了三个年份的判断,只要任意一个年份条件满足,所有数组元素都会被反复赋值为1,完全违背了“每个变量对应单一年份”的逻辑。
优雅解决方案
方案1:用临时数组存储目标年份(适合非连续年份)
通过临时数组将变量数组与目标年份一一对应,循环时仅判断当前索引对应的年份:
data temp2; set temp; /* 定义要生成的二元变量数组 */ array yr(3) year1955-year1957; /* 临时数组存储需要匹配的年份,与变量数组索引一一对应 */ array target_years(3) _temporary_ (1955 1956 1957); do i = 1 to dim(yr); /* 仅判断当前索引对应的年份 */ if year(BeginDate) = target_years(i) or year(EndDate) = target_years(i) then yr(i) = 1; /* 可选:明确设置不匹配时为缺失值,SAS默认不赋值即为缺失 */ else yr(i) = .; end; drop i; run;
方案2:通过索引计算年份(适合连续年份,扩展更方便)
如果目标年份是连续的,无需额外定义年份数组,直接通过索引计算当前年份,后续扩展年份仅需修改变量数组的范围:
data temp2; set temp; /* 若后续扩展到1960,只需改为year1955-year1960,循环自动适配 */ array yr(3) year1955-year1957; do i = 1 to dim(yr); current_year = 1954 + i; /* 1955=1954+1,依次推导后续年份 */ if year(BeginDate) = current_year or year(EndDate) = current_year then yr(i) = 1; end; drop i current_year; run;
效果验证
运行上述代码后,示例数据的输出将符合预期:
ID Begindate EndDate year1955 year1956 year1957 AA 01/01/1956 01/01/1969 . 1 .
内容的提问来源于stack exchange,提问作者AkuAnda
相关产品推荐
相关产品推荐

