Arrays SAS:使用数组转置表

Arrays SAS:使用数组转置表,arrays,sas,transpose,Arrays,Sas,Transpose,我正在尝试重新创建一些代码,这些代码的作用与第9-10页上的相反。因此,我不想让桌子从宽变长,而是希望它从长变宽 Id Col1 Col2 1 Val1 A 1 Val2 B 2 Val1 C 2 Val3 D 3 Val2 E 转换为: Id X_Val1 X_Val2 X_Val3 1 A B . 2 C . D 3 . . E 我该怎么做有什么想法吗?我知

我正在尝试重新创建一些代码,这些代码的作用与第9-10页上的相反。因此,我不想让桌子从宽变长,而是希望它从长变宽

Id Col1  Col2     
1  Val1  A    
1  Val2  B    
2  Val1  C    
2  Val3  D  
3  Val2  E 
转换为:

Id X_Val1 X_Val2 X_Val3  
1  A      B      .
2  C      .      D
3  .      .      E

我该怎么做有什么想法吗?我知道我应该使用数组并尝试创建一个新列X_Val1,其中X_Val1=cat('X',Val1),其中X是一些字符串。

您需要首先计算出需要多少变量。然后,您可以创建变量、使用数组并分配值

data test;
input id col1 $ col2 $;
datalines;   
1  Val1  A    
1  Val2  B    
2  Val3  C    
2  Val4  D   
2  Val5  E
;
run;

/*Need to get the number of variables that need to be created*/
proc sql noprint;
select max(c)
    into :arr_size
    from
    ( select ID, count(*) as c
        from test
        group by id
    );
quit;

/*Get rid of leading spaces*/
%let arr_size=%left(&arr_size);
%put &arr_size;

data test_t;
set test;
by id;
/*Create the variables*/
format SOME_X1 - SOME_X&arr_size $8.;
/*Create an array*/
array SOME_X[&arr_size];

/*Retain the values*/
retain count SOME_X:;

if first.id then do;
count = 0;
do i=1 to &arr_size;
    SOME_X[i] = "";
end;
end;

count = count + 1;
SOME_X[count] = col2;

if last.id then
    output;

keep id SOME_X:;
run;

我不知道除了
PROC TRANSPOSE
之外,您为什么还要使用其他任何东西来执行此操作

proc transpose data=have out=want prefix='X_';
by id;
id col1;
var col2;
run;

嗨,多姆帕兹,谢谢你的评论。我独立地解决了这个问题,但如果我在更一般的情况下再次遇到这个问题,我会参考你的答案。再次感谢:)如果您有SAS 9.3,当在宏变量中选择数值时,您可以使用修剪选项(即:arr_size TRIMMED)删除前导空格和尾随空格。此外,如果您要使用%LET赋值语句删除前导空格和尾随空格,则不需要任何宏函数,至少在9版或更高版本中。查找ID最大数量的sql代码非常有用,谢谢