Loops 如何循环SAS中的一系列周状态变量,并根据其他变量给定的特定周提取状态

Loops 如何循环SAS中的一系列周状态变量,并根据其他变量给定的特定周提取状态,loops,sas,Loops,Sas,我每周有一系列变量描述一个人的“状态”(从2010年第1周到2012年第17周) 变量如下所示: y_1001, y_1002,...y1052, y1101, y1102,......y_1217 我定义变量的周期如下: %let period = y_1001-1052 y_1101-y1148; 我也有一个治疗期作为开始日期和结束日期。我的挑战是找到患者停止治疗后一周内y_uu变量给出的状态 我对SAS不太熟悉,但我的想法是根据一个星期计数器“选择”正确的y_u变量,比如通过计算从周期

我每周有一系列变量描述一个人的“状态”(从2010年第1周到2012年第17周)

变量如下所示:

y_1001, y_1002,...y1052, y1101, y1102,......y_1217
我定义变量的周期如下:

%let period = y_1001-1052 y_1101-y1148;
我也有一个治疗期作为开始日期和结束日期。我的挑战是找到患者停止治疗后一周内y_uu变量给出的状态

我对SAS不太熟悉,但我的想法是根据一个星期计数器“选择”正确的y_u变量,比如通过计算从周期开始(2010年第1周)到治疗结束日期的周数

我有几周的时间来结束这样的治疗

week_count = 1 + intck( 'week.2', '1JAN2010'd, end_treatment_date, 'd');
但如何根据此计数检索相应的y_uu变量?

在对如何循环周期变量并为每个人选择与week_count变量相对应的数字进行了毫无结果的搜索之后,我考虑采用不同的方法。。。说这样的话

array weeks(*) .
do i = 1 to dim(weeks) by 1;
  if week_count = i then end_status = y_10&i;
end
…但经过修改,以考虑阵列的尺寸与周数和年数之间存在不匹配

但是我的挑战是让下面的部分工作起来

if week_count = i then end_status = y_10&i;
如何让SAS根据循环索引选择正确的y_u变量?这似乎是一个非常简单的问题,但不知何故,我还没有找到解决办法。在定义正确的y_u变量时,是否无法使用变量“i”作为输入

如果有人能给你一些提示,我将不胜感激。

我想你想要:

if week_count = i then end_status = weeks{i};

VVALUEX是SAS中鲜为人知的函数,它可以帮助您从SAS变量名中提取值。在这里,您的问题是根据从1月1日到治疗结束的周数构造SAS变量名。通过使用下面示例中的思想,可以避免对每个观察使用DO循环-

data _null_;
    end_treatment_date = "09FEB2010"d;
    y_1007 = 'D';
    status = vvaluex(compress("y_" || substr(strip(year(end_treatment_date)), 3, 2) || put(1 + intck("week.2", "01JAN2010"d, end_treatment_date), z2.)));
    put status;
run;

变量名的构造方式如下:首先取字符串“y_u”,然后使用与前面类似的逻辑将年份的最后两位数字加在变量week_计数后面。获取所需的变量,然后应用VVALUEX获取值。如果有数以百万计的观测值,那么为每个观测值运行DO循环可能是低效的。

啊,是的,你是对的!现在我想删除我的问题:)别担心。我所学到的几乎所有东西都是从犯这样的错误中得到的。我敢打赌你再也不会这样做了!