SAS做Whitlock Loop

时间:2014-07-21 08:42:53

标签: sas

我是SAS的新手,这是我需要回答的问题。以为我发布了整个问题,以帮助人们更好地理解我的问题。

给出了部分血液学数据。计算每次就诊的基线变化(基线定义为最后一次非缺失的剂量前测量)。 a。使用基线子集和合并。 b。使用Do Whitlock组。 只有在剂量后测量时才会显示从基线的变化。

data hemo;
length visit $12 param $12;
input subjid visit $ param $ value ;
cards;
101 Screening    Haemoglobin 12.6
101 Visit1       Haemoglobin .
101 Visit2(Dose) Haemoglobin 12.7
101 Visit3       Haemoglobin 8.6
102 Screening    Haemoglobin 11.6
102 Visit1       Haemoglobin 11.5
102 Visit2(Dose) Haemoglobin 10.4
102 Visit3       Haemoglobin 11.5
103 Screening    Haemoglobin .
103 Visit1       Haemoglobin 10.5
103 Visit2(Dose) Haemoglobin 11.2
103 Visit3       Haemoglobin 12.1
;
run;

使用do Whitlock循环我需要帮助。到目前为止,我是这个(实际上没什么:D)

data q4b;
retain subjid visit param value change;
do i =1 by 1 until (last.subjid);
    set hemo;
    by subjid;
    if value ne . then change = change - value;
    output;
end;

2 个答案:

答案 0 :(得分:2)

没有DoW(Do Whitloop): (所有访问)

data change;
    set hemo;
    by subjid;
    retain baseline;
    if (first.subjid) then baseline=.;
    change = value - baseline;
    output;
    if value ne . then baseline = value;
run;

使用DoW: (仅限上次访问)

data change (drop=base); 
    do until (last.subjid); 
        set hemo; 
        by subjid;
        change = value - base;
        baseline = base;
        if value ne . then base = value; 
    end; 
run;

(详情见paper


编辑:我添加了另一个例子来阐明保留/输出机制。

data test;
    do i=1 to 10;
        output;
    end;
run;
data test;
    set test;
    retain j;
    output;
    j=i;
run;

这里有1到10的变量。变量j在输出语句之后计算,因此它的值(= i)不会在它设置的相同数据周期中打印。 / p>

通常它的值会被遗忘但是retain语句会让SAS记住它从一个循环到下一个循环,它会在输出数据集中打印出来。 结果是一个缩放的i-j夫妇:

i j
---
1 .
2 1
3 2

答案 1 :(得分:1)

Sas datasteps自动循环遍历set MyDataset;的观察,因此您无需循环。 您需要保留的是基线和指示基线已找到且不再需要更新(datastep中的最后一条指令)。当找到对象的第一个障碍时,需要重置基线和指示器。 函数索引为您提供找到的字符串的位置,否则为0。

data change;
    set hemo;
    by subjid;
    retain Baseline BaselineFound;
    if first.subjid then do;
        Baseline=.;
        BaselineFound=0;
    end;
    if index(visit,"Dose") then BaselineFound=1;
    if BaselineFound=1 and index(visit,"Dose")=0 then change=value-Baseline;
    if BaselineFound=0 and value>. then Baseline=value;
run;