2015-10-19 32 views
0

我刚开始使用SAS,我试图组合列。在SAS中组合列

我有表mainData

A1 A2 A3 A4 
1 4 7 10 
2 5 8 11 
3 6 9 12 

我想创建一个新表rearrangedData

Type Value 
A1 1 
A1 2 
A1 3 
A2 4 
A2 5 
A2 6 
A3 7 
A3 8 
A3 9 
A4 10 
A4 11 
A4 12 

必须有一个简单的解决这个我实在不明白这一点。我正在考虑编写do循环,但如果我不知道特定列中的表的大小或行数,该怎么办?我无法弄清楚如何在SAS中获得这些信息。

回答

1

这有点不寻常转化可以通过转置和一些阵列逻辑来完成:

data have; 
input A1 A2 A3 A4; 
cards; 
1 4 7 10 
2 5 8 11 
3 6 9 12 
; 
run; 

proc transpose data = have out = tr name=type prefix = r; 
run; 

data want; 
set tr; 
array r{*} r:; 
do i = 1 to dim(r); 
    value = r[i]; 
    output; 
end; 
drop i r:; 
run; 

此外,这样可以保留原来的顺序,而不需要排序。

0

制作一个虚拟变量,然后转置数据。

data have; 
    set have; 
    id=_n_; 
run; 

proc transpose data=have out=temp; 
by id; 
var A1-A4; 
run; 

proc sort data=temp out=want(rename=(_name_=type col1=value) drop=id); 
by _name_; 
run; 
+0

我建议使用视图的第一步如果数据集还没有某种id列。 – user667489

+0

如果第一列是唯一的,那么它可以用作BY变量,并且也包含在要转置的变量列表中。 – Tom

0

如果你想保留原来的顺序,那么你可以在每个数据变量(列)设置一次使用POINT =选项的SET语句来循环。

所以这个数据集将读取第一个观察值,以获得定义的变量。然后定义数组VALUES,以便我们可以使用DIM(VALUES)来知道有多少列。然后它使用SET语句中的POINT=NOBS=选项来控制另一个循环。它使用VNAME()函数来查找数组中当前变量的名称。

data want ; 
    set have ; 
    array values _numeric_; 
    do col=1 to dim(values); 
    length type $32 value 8; 
    type=vname(values(col)); 
    do row=1 to nobs ; 
     set have point=row nobs=nobs ; 
     value=values(col); 
     output; 
     keep type value; 
    end; 
    end; 
    stop; 
run; 
+0

尽管每个变量都有效地读取整个输入数据集,但它在一个数据步骤中完成所有工作。 – user667489