Loops SAS计算特定值的多个法术的持续时间
我有一个看起来像下面的数据集。一个人可以是“被动的”、“主动的”或“其他的”。我想计算一个人在变为“主动”之前“被动”的周数。变量“start_week”表示“被动”法术何时开始。如果一个人有一个以上的“被动”咒语,观察会在下一行再次发生,但每周的开始时间不同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
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的)索引,而不是如上所述的被动周-您的描述是否颠倒了?为什么您需要连续四周的活动周来标记向活动周的过渡?请说明实际发生的情况并解释其不正确的原因,而不仅仅是说“出了问题”。