* 질문 : http://cafe.daum.net/statsas/B3m/13489;
1. 최홍규님 답변(http://cafe.daum.net/statsas/B3m/13490);
/* array를 이용하시면 될 것 같습니다 */
* 예시해주신대로 일단 데이터가 다음과 같이 들어있다고 보고요..;
data fin;
input company $ sale2001 debt2001 asset2001 sale2002 debt2002 asset2002 sale2003 debt2003 asset2003;
cards;
A 811 211 511 812 212 512 813 213 513
B 821 221 521 822 222 522 823 223 523
C 831 231 531 832 232 532 833 233 533
D 841 241 541 842 242 542 843 243 543
;
run;
* 2차원 array를 1차원 array로 바꿉니다;
data fin2;
set fin;
format year best.;
array f1(2001:2003,3) sale2001--asset2003; * 입력되는 변수들을 2차원 array로 잡고...;
array f2(3) sale debt asset; * 출력할 변수들을 1차원으로 잡습니다;
do year=2001 to 2003;
do i=1 to 3;
f2(i) = f1(year,i);
end;
output;
end;
keep company year sale debt asset;
run;
2. 안두진님 답변(http://cafe.daum.net/statsas/B3m/134910);
proc sort data = fin;
by company;
run;
* 매출액;
proc transpose data = fin out = fin_sale prefix = sale;
var sale:;
by company;
run;
* 연도 생성;
data fin_sale2;
set fin_sale;
year = input(compress(_name_, , 'A'), 8.);
drop _name_;
run;
* 부채;
proc transpose data = fin out = fin_debt prefix = debt;
var debt:;
by company;
run;
* 연도 생성;
data fin_debt2;
set fin_debt;
year = input(compress(_name_, , 'A'), 8.);
drop _name_;
run;
* 자산;
proc transpose data = fin out = fin_asset prefix = asset;
var asset:;
by company;
run;
* 연도 생성;
data fin_asset2;
set fin_asset;
year = input(compress(_name_, , 'A'), 8.);
drop _name_;
run;
* 하나로 합치기;
data fin_result;
merge fin_sale2
fin_debt2
fin_asset2
;
by company
year
;
run;
proc print data = fin_result;
run;
3. 조재천님 답변(http://cafe.daum.net/statsas/B3m/13493);
proc sort data = fin;
by company;
run;
proc transpose data = fin out = fin1 ;
var _numeric_;
by company;
run;
data fin1(drop=_:); set fin1;
name=compress(_name_,,'d');
year=compress(_name_,,'a');
run;
proc transpose data = fin1 out = fin2(drop=_:) ;
var col1;
by company year;
id name;
run;
4. 백승민 답변(http://cafe.daum.net/statsas/B3m/13496);
* OUTPUT문장으로 출력;
* SAS File 입출력(I/O) 함수로 변수명의 정보 추출;
* OPEN함수 : SAS 데이터 세트를 OPEN하고, 데이터 세트 ID를 반환한다.
http://www.statwith.pe.kr/SAS/1.FUNCTION/F0304.htm;
* varname : 함수를 사용하여서 변수의 이름 찾아오기
http://www.statwith.pe.kr/SAS/1.FUNCTION/F0427.htm;
* CLOSE : 앞에서 열었던 SAS 데이터 세트를 닫는다.
http://www.statwith.pe.kr/SAS/1.FUNCTION/F0090.htm;
data back;
set fin;
length year $4.;
tableid = open('fin','i');
sale = sale2001;
debt = debt2001;
asset = asset2001;
year = substr(varname(tableid,2),5,4);
output;
sale = sale2002;
debt = debt2002;
asset = asset2002;
year = substr(varname(tableid,5),5,4);
output;
sale = sale2003;
debt = debt2003;
asset = asset2003;
year = substr(varname(tableid,8),5,4);
output;
rc = close(tableid);
keep company sale debt asset year;
run;
* 1차원 배열 사용;
* VNAME : 지정된 변수의 이름을 반환한다.
http://www.statwith.pe.kr/SAS/1.FUNCTION/F0456.htm;
data back1(rename=(sale1= sale debt1=debt asset1=asset));
set fin;
length year $4.;
array sale[3] sale2001 - sale2003;
array debt[3] debt2001 - debt2003;
array asset[3] asset2001-asset2003;
do i=1 to 3;
sale1 = sale(i);
debt1 = debt(i);
asset1 = asset(i);
year = substr(vname(sale(i)),5,4);
output;
end;
keep company sale1 debt1 asset1 year;
run;
Join us for SAS Innovate 2025, our biggest and most exciting global event of the year, in Orlando, FL, from May 6-9. Sign up by March 14 for just $795.