2016-05-12 52 views
1

我有一個時間序列SAS數據集,我想將其轉換爲垂直數據集。如何在sas中將多個列合併爲一個

我的數據看起來像..

ID A2009 A2010 A2011 A2012 
1  1  2  3  4 
2  1  2  3  4 
3  1  2  3  4 
4  1  2  3  4 
5  1  2  3  4  

data multcol; 
infile datalines; 
input ID A2009 A2010 A2011 A2012 A2013; 
return; 
datalines; 
1 1 2 3 4 5 
2 1 2 3 4 5 
3 1 2 3 4 5 
4 1 2 3 4 5 
5 1 2 3 4 5 
; 
run; 

proc print data=multcol noobs; 
run; 

我在網上搜索只找到一個解決方案爲following.Not工作。 但我的數據集太大,這種方法關閉我的電腦。

data cmbcol(keep=a orig_varname orig_obsnum); 
set multcol; 
array myvars _numeric_; 
do i = 2 to dim(myvars); 
orig_varname = vname(myvars(i)); 
orig_obsnum = _n_; 
A = myvars(i); 
output; 
end; 
run; 

proc print data=cmbcol ; 
title 'cmbcol'; 
run; 

proc sort data=cmbcol; 
by orig_varname a; 
run; 

proc print data=cmbcol noobs; 
title 'cmbcol'; 
run; 

而且我希望他們變成這樣。

ID t t+1 
1 1 2  
2 1 2  
3 1 2 
4 1 2 
5 1 2 
1 2 3 
2 2 3 
3 2 3 
4 2 3 
5 2 3 
1 3 4 
2 3 4 
3 3 4 
4 3 4 
5 3 4 

我們該怎麼做?

在此先感謝。

+0

這裏的想法是幫助人們使用他們的代碼而不是真的在做他們的工作。請向我們展示一些代碼,以便人們可以幫助您。 – javidazac

+0

這是一個非常奇怪的結構。看轉置得到你的t列,然後你可以用幾種方法來產生你的lead(t + 1)變量。這裏有多種解決方案。如前所述,嘗試一些,然後有人會幫助代碼。 – Reeza

+0

對不起。我編輯帖子。感謝提醒。 –

回答

1

這是一個不尋常的數據結構,但您可以使用下面的宏來實現這一點(根據您的需要調整)。

options validvarname = any; 

%macro transp; 
    %let i = 2009; 
    %do %while (&i <= 2011); 
    %let j = %eval(&i + 1); 
    data part_&i(rename = (A&i = t A&j = 't+1'n)); 
     set multcol(keep = ID A&i A&j); 
    run; 
    %let i = %eval(&i + 1); 
    %end; 

    data combined; 
    set part_:; 
    run; 

    proc datasets nolist nodetails; 
    delete part_:; 
    quit; 
%mend transp; 

%transp 
+0

非常感謝你!有用!!!我從你那裏學到很多答案,並且我也學習如何擴展它。再次感謝你!! –

+0

很高興它適合你。感謝您的反饋,我也從人們的問題中學習! :) –