SAS进入专栏

时间:2017-06-26 07:53:34

标签: sas

我需要将行转换为SAS中的列。我的问题几乎与这个问题相同: Convert Database Rows into Columns

主要区别在于我需要使用数组来执行此操作。我不完全确定如何处理这个问题。我看过TRANSPOSE,但这并不符合我的问题标准。对于如何开始这个问题,或者如何处理这个问题,我们将不胜感激。

感谢。

编辑:

Data old;
input id year cost; 
datalines;
1 1998 20
1 1999 30
1 2000 40
2 1998 20
2 1999 21
2 2000 25
3 1998 32
3 1999 33
;
run; 

data want;
set old;
by ID;
array allcost(3) c1 - c3;
retain c1-c3;
if first.id then i=1;
else i+1;
allcost(3) = cost;
if last.id;
run;

我希望看起来像这样:

       1998 1999 2000

1      20    30   40
2      20    21   25
3      32    33

我没有得到这个结果,而是在c3列中得到了一个成本列表。我究竟做错了什么? 请注意,c1-c3代表年份。

1 个答案:

答案 0 :(得分:2)

看起来你有正确的想法,但你只能在c3列中获取值,因为语句allcost(3)仅指向数组中的第三个位置,所以你需要使用的值i作为索引。

让我们对您的代码进行一些小修改,看看会发生什么。

data new;
set old;
by id;
retain _1998-_2000(drop=year cost i);
array costs(3) _1998-_2000;
if first.id then i = 1;
else i + 1;
costs(i) = cost;         * Adding the 'i' index will point to the correct cost variable.;
if last.id then output;  * This will output the array as a row.;
run;

这段代码似乎非常接近,但让我们检查输出。

id    _1998    _1999    _2000

 1      20       30       40
 2      20       21       25
 3      32       33       25

_2000的第三行除了之外的所有内容。这是因为_2000的值从未在最后一个组中被替换。为了解决这个问题,我们可以在每个副组的开头清除数组。

data new(drop=year cost i j);
set old;
by id;
retain _1998-_2000;
array costs(3) _1998-_2000;
if first.id then do;
    do j = 1 to 3;
        costs(j) = .; * set each value in array to missing.;
    end;
    i = 1;
end;
else i + 1;
costs(i) = cost;
if last.id then output;
run;

现在生成的数据集看起来正确。

id    _1998    _1999    _2000

 1      20       30       40
 2      20       21       25
 3      32       33        .