我运行下面的数组代码
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;
答案 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;