我在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但是我的问题有额外的维度而且我被卡住了。任何帮助将不胜感激!
答案 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变量
下您可以在“结果”选项下自定义输出数据集名称。