SAS比较多个变量的值

时间:2017-07-31 16:16:19

标签: arrays sas multiple-columns

我有以下示例数据集,其中包含ID和合同状态,为期六个月(2017年1月1日至6月6日)。

示例数据:

ID   Month1   Month2   Month3   Month4   Month5   Month6**
12   5        5        5        5        5        5
34   5        5        6        6        5        5
56   6        6        6        -7       -7       -7
78   6        6        5        5        5        5
12   5        5        5        5        6        -7

如果状态为5,则ID处于活动状态,如果6已取消,则-7为"无法重新激活"。

我想检查两种变化: 1)ID从状态5变为6 2)ID从6变为5

当状态从5变为6时,我想要一个新变量" churn"包含状态更改为6的月份。 对于第二组,我想要一个新变量"重新激活"包含状态更改为5的月份。 如果ID在两个组中(从5到6到5),则应填充两个变量。

到目前为止我所拥有的是一个数组,它显示了一行中有多少状态匹配,但我没有进行下一步。这是代码:

data want (drop= i j);
    set have (obs=100);
    array stat_check {*} month1-month6;
    sum=0;
    do i=1 to dim(stat_check)-1;
        do j=i+1 to dim(stat_check);
            sum=sum(sum,stat_check(i) eq stat_check(j));
        end;
    end;
run;

提前致谢!

2 个答案:

答案 0 :(得分:0)

对于数组方法,听起来需要将数组中的每个变量与之前的变量进行比较。你不需要通过阵列两次,只有一次。您想比较month2到month1,month3到month2 ... month6到month5。

我会尝试像(未经测试的):

data want (drop= month);
    set have (obs=100);
    array stat_check {*} month1-month6;
    sum=0;
    do month=2 to dim(stat_check);
        if stat_check{month}-stat_check{month-1} = 1 then Churn=month;
        else if stat_check{month}-stat_check{month-1} = -1 then Reactivation =month;
    end;
run;

如果您可以为同一ID进行多次搅拌或多次重新激活,则会捕获最新的流失或重新激活。

但老实说,我会将数据转换为每个ID月一行。这样可以避免使用数组,并允许您捕获多个churns /重新激活。通常,使用较高的瘦数据而不是较短的宽数据更容易。例如,可以很容易地计算每个ID处于活动状态的月数。

答案 1 :(得分:0)

你可以尝试这个。 vname函数用于获取变量名称(月份)

data two (drop= i j);
set one;
array stat_check {*} m1-m6;
sum=0;
do i=1 to dim(stat_check)-1;
    do j=i+1 to dim(stat_check);
        sum=stat_check(i)-stat_check(j);
        if sum=1 then churn=vname(stat_check(i)); 
        if sum=-1 then reactivation=vname(stat_check(i));
    end;
end;

运行;