Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sas 根据指示符保存状态,可以使用Retain语句_Sas - Fatal编程技术网

Sas 根据指示符保存状态,可以使用Retain语句

Sas 根据指示符保存状态,可以使用Retain语句,sas,Sas,如图所示,我按rk和降序版本对数据进行了排序: data have; rk = 1; version = 7; ind = 0; output; rk = 1; version = 6; ind = 1; output; rk = 1; version = 5; ind = 0; output; rk = 1; version = 4; ind = 0; output; rk = 1; version = 3; ind = 1; output; rk = 1; version = 2; ind

如图所示,我按rk和降序版本对数据进行了排序:

data have;
rk = 1;
version = 7;
ind = 0;
output;
rk = 1;
version = 6;
ind = 1;
output;
rk = 1;
version = 5;
ind  = 0;
output;
rk = 1;
version = 4;
ind = 0;
output;
rk = 1;
version = 3;
ind = 1;
output;
rk = 1;
version = 2;
ind = 0;
output;
rk = 1;
version = 1;
ind = 0;
output;
rk = 1;
version = 0;
ind = 0;
output;
run;
我想到了保留声明。但是这个问题的任何解决方案都适合我。 我需要做的是, 如果在某个点,ind=1,我希望相同rk的所有以前的行(版本)都有某种指示

所以基本上, 版本0,1,2应该被标记,因为版本3的ind=1

版本4,5应该被标记,因为版本6的ind=1

但是版本7根本不应该受到影响,因为它出现在ind=1的行之后, 而不是在他们面前

如果每个标记行都受ind=1的行影响,则效果会更好 将有一个指示器,指示受该更改影响的版本号, 意思 版本0,1,2将有一个名为“Infected_by”的字段,该字段等于3 版本4,5将使该字段等于6


非常感谢你的帮助

由于数据集已排序,我们将使用您的排序集“前进”(我认为这更容易)。我们将使用
SELECT
语句,因为我们只希望每次迭代执行一次。我们还将使用您建议的
RETAIN
语句和
CAT
函数将字符串连接在一起,以生成指示符
标志

data test;
    set have;
    drop N count x;

    select;
        when(ind = 1) do;
            N = 1;
            count = version;
            retain N count;
            output;
        end;

        when(N = 1) do;

            x = ind;
            flag = cat('Flagged because of version ', count);
            N = .;
            retain x count;
            output;
        end; 

        when(x = ind) do;
            flag = cat('Flagged because of version ', count);
            retain x count;
            output;
        end;
        otherwise do;
            output;
        end;
    end;

run;
输出:

                   rk    version    ind                flag

                    1       7        0
                    1       6        1
                    1       5        0     Flagged because of version 6
                    1       4        0     Flagged because of version 6
                    1       3        1
                    1       2        0     Flagged because of version 3
                    1       1        0     Flagged because of version 3
                    1       0        0     Flagged because of version 3
在这种情况下,
N
用作上一次观察的ind=1的指标。然后我们销毁它(即N=),否则它将在下一次迭代中再次满足N=1条件

请注意,我们保留变量
x
count
,用于将
x
与下一个
ind
进行比较。变量
count
等于ind=1的行中的版本。对于标志指示器,使用
CAT
功能将数字变量
count
添加到字符串中


干杯。

由于数据集已排序,我们将使用您的排序集“前进”(我认为这更容易)。我们将使用
SELECT
语句,因为我们只希望每次迭代执行一次。我们还将使用您建议的
RETAIN
语句和
CAT
函数将字符串连接在一起,以生成指示符
标志

data test;
    set have;
    drop N count x;

    select;
        when(ind = 1) do;
            N = 1;
            count = version;
            retain N count;
            output;
        end;

        when(N = 1) do;

            x = ind;
            flag = cat('Flagged because of version ', count);
            N = .;
            retain x count;
            output;
        end; 

        when(x = ind) do;
            flag = cat('Flagged because of version ', count);
            retain x count;
            output;
        end;
        otherwise do;
            output;
        end;
    end;

run;
输出:

                   rk    version    ind                flag

                    1       7        0
                    1       6        1
                    1       5        0     Flagged because of version 6
                    1       4        0     Flagged because of version 6
                    1       3        1
                    1       2        0     Flagged because of version 3
                    1       1        0     Flagged because of version 3
                    1       0        0     Flagged because of version 3
在这种情况下,
N
用作上一次观察的ind=1的指标。然后我们销毁它(即N=),否则它将在下一次迭代中再次满足N=1条件

请注意,我们保留变量
x
count
,用于将
x
与下一个
ind
进行比较。变量
count
等于ind=1的行中的版本。对于标志指示器,使用
CAT
功能将数字变量
count
添加到字符串中


干杯。

您确定要所有“前”行吗?因为现在您的数据集看起来是这样的:这更像是您需要所有后续行(之后)。好吧,我这样排序数据,因为我认为它是解决方案的一部分。。。当然,您可以按自己认为合适的方式对其进行排序。我想要所有的“前几行”。对非常感谢。确实要所有“上一行”吗?因为现在您的数据集看起来是这样的:这更像是您需要所有后续行(之后)。好吧,我这样排序数据,因为我认为它是解决方案的一部分。。。当然,您可以按自己认为合适的方式对其进行排序。我想要所有的“前几行”。对非常感谢。我很高兴我帮了忙。我在学院/大学学习了SAS基础编程课程,为SAS学院认证专业(基础编程)考试做准备。但是我还没有参加考试。。我学到的大部分东西都是通过在线阅读SAS的论文,尤其是全球论坛的论文。事实上,我从未读过SAS的书,因为我认为这是敲诈,因为他们是唯一一家制作这些书的公司。我有一些C、Matlab和Python的编程经验,这使SAS更容易学习。再次感谢您的回复。请您说明一下常规If语句和您使用的Select语句之间的区别好吗?在本例中,回想一下数据步骤是一个循环。如果我们在一个数据步循环中有一组If语句,那么它们都将在每次迭代中进行计算,除非我们在每个If条件中使用RETURN语句。但是对于SELECT语句,在满足一个when()条件并执行其结果后,它将保留整个SELECT语句,而不计算后续的其他when()条件。谢谢。只要有一个指示器,它就可以正常工作。问题是,我有8个指示符字段,每一个字段我都需要做正确的事情。我试着自己做,当然没能成功。。。我假设Select语句在这种情况下不起作用……嗯。在第一个when条件中,将其改为when(ind In(ind1,ind2,ind3,…)。例如,当(ind in(1,2,3,4))表示您的指标编号时。试试看它是否管用。我很高兴我帮了忙。我在学院/大学学习了SAS基础编程课程,为SAS学院认证专业(基础编程)考试做准备。但是我还没有参加考试。。我学到的大部分东西都是通过在线阅读SAS的论文,尤其是全球论坛的论文。事实上,我从未读过SAS的书,因为我认为这是敲诈,因为他们是唯一一家制作这些书的公司。我有一些C、Matlab和Python的编程经验,这使SAS更容易学习。再次感谢您的回复。请您说明一下常规If语句和您使用的Select语句之间的区别好吗?在本例中,回想一下数据步骤是一个循环。如果我们在一个数据步循环中有一组If语句,那么它们在每次迭代中都将被计算,除非我们使用返回st