【问题标题】:SAS not picking up years in loopSAS 没有循环使用多年
【发布时间】:2019-02-16 17:01:12
【问题描述】:

我正在使用以下数据集

data have;
    input repricingdate1-repricingdate3;
    datalines;

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

run;

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

我希望创建一个变量“Flag”,如果重新定价日期与标志年份匹配,即第一行的 Flag(2019)=1,两行的 Flag(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;

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

【问题讨论】:

    标签: arrays sas do-loops sas-studio


    【解决方案1】:

    我不知道您的错误在哪里,但是您可以通过查找年份并将其设置为 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 日期。正如您所提到的,您的演示代码

    【讨论】:

    • 我的错误是标志没有用我的第二段代码填写,但我设法对其进行了重组并获得了解决方案。我也试试这个。
    • 我添加了您的问题,但没有按照您的建议进行测试,您的示例代码运行不正确。这里有创建演示数据的代码:communities.sas.com/t5/SAS-Communities-Library/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多