Loops SAS计算特定值的多个法术的持续时间

Loops SAS计算特定值的多个法术的持续时间,loops,sas,duration,Loops,Sas,Duration,我有一个看起来像下面的数据集。一个人可以是“被动的”、“主动的”或“其他的”。我想计算一个人在变为“主动”之前“被动”的周数。变量“start_week”表示“被动”法术何时开始。如果一个人有一个以上的“被动”咒语,观察会在下一行再次发生,但每周的开始时间不同 ID y_1449 y_1448 y_1449 y_1450 y_1451 y_1452 y_1501 ... y_1608 start_week 01 passive passive pass

我有一个看起来像下面的数据集。一个人可以是“被动的”、“主动的”或“其他的”。我想计算一个人在变为“主动”之前“被动”的周数。变量“start_week”表示“被动”法术何时开始。如果一个人有一个以上的“被动”咒语,观察会在下一行再次发生,但每周的开始时间不同

ID  y_1449   y_1448   y_1449   y_1450   y_1451   y_1452    y_1501   ...  y_1608  start_week 
01  passive  passive  passive  passive  active   active    active   ...          5
02  other    passive  active   active   active   passive   active   ...          3
02  other    passive  active   active   active   passive   active   ...          7
04
...
N  other   other     other    other    passive   active    active   ...          6
我的代码只需要一个法术就可以计算观察的持续时间,但是当观察再次发生时,出现了一些错误,两个持续时间都没有正确计算。我有以下代码:

%let period = y_1449-y_1452 y_1501-y_1553 y_1601-y_1608;
%let passive = 'passive';
%let active = 'active';

data want;
    data have;
    array y(*) $period;
    transition_to_active=0;
    weeks=0;
    active_week;

    do i=start_week to 62;
         if y(i) in &passive. then do;
              weeks=weeks+1;
         end;

         if y(i) in &active. and y(i+1) in &active. 
         and y(i+2) in &active. and y(i+3) in &active. then do;
             transition_to_active=1;
             active_week=i;
             leave;
         end;
    end;
run;
此处“转为主动”表示该人员是否已从“被动”转为“主动”,而“主动周”表示该人员进行此转换的周。
有人能理解为什么计算持续时间不适用于多个法术吗?

我认为这解决了你的问题:

data input;
input ID start_week y_1447 $  y_1448 $  y_1449 $  y_1450 $  y_1451 $  y_1452  $  y_1501 $;
datalines;
01 3 passive passive passive passive active active  active   
02 5 other   passive active  active  active passive active   
02 7 other   passive active  active  active passive active   
;
run;

%let period = y_1447--y_1501;
%let passive = 'passive';
%let active = 'active';

data want;
set input;
array y[*] .
by ID;

last_sw = lag(start_week);
if first.id then
    weeks = start_week-1;
else do;
    start = last_sw;

    weeks = 0;

    do i=start to start_week;
        if y[i]= &passive then
            weeks = weeks + 1;
    end;
end;

drop start last_sw i;
run;
在上一个
Start\u周
开始计数循环,计算“被动”的数量,并在到达新的
Start\u周
时停止


如果这是
ID
的第一次,那么您只需要
START\u WEEK
减去1就可以得到开始前的周数。

您的数据、算法描述和实现都有些不一致。示例记录都将“开始周”设置为活动周的(基于1的)索引,而不是如上所述的被动周-您的描述是否颠倒了?为什么您需要连续四周的活动周来标记向活动周的过渡?请说明实际发生的情况并解释其不正确的原因,而不仅仅是说“出了问题”。