首页 > 解决方案 > SAS 没有循环使用多年

问题描述

我正在使用以下数据集

data have;
    input repricingdate1-repricingdate3;
    datalines;

    '30SEP2019'd '31DEC2020'd '31MAR2022'd
    '31DEC2020'd '30JUN2023'd '31DEC2025'd
    ;

run;

如果这不是输入日期的正确方法,请原谅,我不确定,但我有一个使用 intnx 函数的表格,其中包含这些值

我正在寻找创建一个变量“标志”,如果重新定价日期与标志年份匹配,即第一行的标志(2019)=1,两行的标志(2020)=1,则返回一个“1”,依此类推。

我正在使用下面的代码,看不到我的错误在哪里,它甚至在一个更大的数据集中找到了几行,但是是零星的

data want;
    set have;

    array flag(2018:2021) flag2018-flag2021;
    array repricingdate(1:3);

    do i = 2018 to 2021;

        do j = 1 to 3;
            if put(repricingdate(j), 4.) = compress(vname(flag(i)),, 'kd') 
            then flag(i)=1;
        end;
    end;

    drop i;

run;

如果有人能指出我的错误,我将不胜感激,谢谢。

标签: arrayssasdo-loopssas-studio

解决方案


我不知道您的错误在哪里,但是您可以通过查找年份并将其设置为 1 而不是遍历所有年份来大大简化这一过程。

data want;
    set have;

    array flag(2018:2021) flag2018-flag2021;
    array _date(1:3);

        *set all to 0 initially;
        do i=lbound(flag) to hbound(flag);
                flag(i)=0;
        end;

        do i = 1 to 3;
            year_data=year(_date(i));
            flag(year)=1;
        end;


    drop i;

run;

编辑:您的错误在这里: put(repricingdate(j), 4.) -> 这不会产生年份值。如果您想要年份,请改用 YEAR 函数 year(repricingdate(j))

这假设您的日期实际上是 SAS 日期。正如您所提到的,您的演示代码


推荐阅读