在SAS中每次观察结束时重置保留的数组值

时间:2015-03-25 20:02:12

标签: arrays sas

我运行下面的数组代码

DATA Want;
    SET Have;
        ARRAY Dates{2562} (&Start_Date:&End_Date);
        DO i = 1 TO DIM(Dates);
            IF Dates[i] >= ObStartDate AND Dates[i] <= ObEndDate THEN Dates[i] = 1;
        END;
RUN;

我找到了最小日期(即我的数据集的第一个Obstartdate日期)和最大日期(即我的数据集的最后一个ObEndDate日期),这些值设置为&amp; Start_Date和&amp; End_Date。阵列正确创建并为每个观察输入未格式化的SAS日期值。我还想查看每个观察结果并说明每个数组Dates列中的值是否在Observations个别开始日期和结束日期之间,然后将该值替换为1.

继续出错的地方。它保留了从观察到观察的ObStartDate和ObEndDate,并且当它选择较低的ObStartDate或更高的ObEndDate时,只替换不同的日期[i]。

当阵列Do循环到达每个连续观察时,有没有办法可以将ObStartDate和ObEndDate重置为每个观察值ObStartDate和ObEndDate

我尝试过创建数组并在不同的datastep中执行Do循环。我也尝试将循环放在循环中的循环内,循环内的数组等等。我可能已经接近成功但这是我认为可行的代码和我写的第一个代码。

任何帮助将不胜感激。 欢呼声。

这是一些代码,看看我的意思

DATA Haveyay;
    ATTRIB Ob LENGTH=3
            ObStartDate Length=3
            ObEndDate Length=3;
INFILE datalines DELIMITER='~';
    INPUT Ob ObStartDate ObEndDate ;
    DATALINES;
    1~1~8
    2~2~5
    3~5~10
    4~1~4
    5~2~3
    6~4~7
    7~7~10
    8~3~4
    9~3~9
    10~2~9
;
RUN;

PROC SQL Noprint;
    SELECT min(ObStartDate), max(ObEndDate) into :Start_Date, :End_Date
    FROM Haveyay;
QUIT;

DATA Wantyay;
    SET Haveyay;
        ARRAY Dates{10} (&Start_Date:&End_Date);
            DO i = 1 to DIM(Dates);
                IF Dates[i] >= ObStartDate AND Dates[i] <= ObEndDate THEN Dates[i] = 1;
            END;
RUN;

1 个答案:

答案 0 :(得分:2)

看起来您的问题可能是您期望dates数组中的值在每次观察时都会重置为其原始值。实际上,array语句只在加载任何数据之前初始化数组中的值一次。由于数组变量会自动保留,因此您对数组成员所做的每个更改都将转移到以后的观察中。

输出后,您可以使用第二个循环重置日期值:

do i = 1 to dim(dates);
    if obstartdate <= dates[i] <= obenddate then dates[i] = 1;
end;
output;
do i = 1 to dim(dates);
    dates[i] = &start_date. + i - 1;
end;

或者更紧凑地计算i和宏变量而不是数组的日期:

do i = 1 to dim(dates);
    _date = &start_date + i - 1;
    dates[i] = ifn(ObStartDate <= _date <= ObEndDate , 1, _date);
end;