使用条件修改SAS数据集

时间:2016-10-14 21:22:39

标签: sas enterprise-guide

我在SAS Enterprise Guide中有一个如下所示的数据集:

ID |年|实体| Inv1 | Inv2 | Inv3 | Inv4 | INV5
1 | 2015年| A | 2 | 3 | 。 | 5 | 。
1 | 2016 | A | 。 | 2 | 3 | 。 | 。
2 | 2015年| B | 1 | 。 | 3 | 。 | 4
3 | 2016 | C | 。 | 2 | 。 | 3 | 。
2 | 2016 | B | 5 | 。 | 。 | 2 |。
3 | 2015年| C | 。 | 1 | 。 | 。| 3

我希望将其转换为:

ID |年|实体| Inv |值
1 | 2015年| A | Inv1 | 2
1 | 2015年| A | Inv2 | 3
1 | 2015年| A | Inv4 | 5
1 | 2016 | A | Inv2 | 2
1 | 2016 | A | Inv3 | 3
2 | 2015年| B | Inv1 | 1
2 | 2015年| B | Inv3 | 3
2 | 2015年| B | Inv5 | 4
3 | 2016 | C | Inv2 | 2
3 | 2016 | C | Inv4 | 3
2 | 2016 | B | Inv1 | 5
2 | 2016 | B | Inv4 | 2
3 | 2015年| C | Inv2 | 1
3 | 2015年| C | Inv5 | 3

我在互联网上搜索过,我已经提出了这个问题:http://support.sas.com/kb/24/635.html但是我的问题有额外的维度而且我被卡住了。任何帮助将不胜感激!

3 个答案:

答案 0 :(得分:1)

这是一个简单的转置。

首先对数据进行排序:

proc sort data=have;
by id year entity;
run;

然后转置。您将重命名列并过滤掉缺少的值:

proc transpose data=have out=want(where=(value1^=.)) name=Inv prefix=Value;
by id year entity;
var inv:;
run;

Proc Transpose会将变量创建为Value1,如果需要,可以重命名。

proc datasets lib=work nolist;
modify want;
   rename Value1=Value;
run;
quit; 

答案 1 :(得分:0)

您必须创建一个数组并使用它,在inv个变量之间进行迭代。

 data result;
    set source;

    array inv_tab(*) inv1-inv5;

    do i = 1 to dim(inv_tab);
        if inv_tab(i) ^= . then do;
            inv = vname(inv_tab(i));
            value = inv_tab(i);
            output;
        end;
    end;

    drop i inv1-inv5;
run;

答案 2 :(得分:0)

在EG中,您也可以使用转置任务。

将INV变量放在TRANSPOSE变量下。 将ID YEAR ENTITY置于GROUP BY变量

您可以在“结果”选项下自定义输出数据集名称。