加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

SAS转置的问题(全攻略)

(2014-03-14 01:12:27)
http://bbs.pinggu.org/thread-2945535-1-1.html

我有一个这样的数据:

id   var1   _20140303 _20140304
 价格         10              15
 收入         11              17
 价格                        15
 收入                        15


想转换成:

id    日期                价格    收入
  _20140303       10       11
  _20140304       15       17
  _20140303                 2
  _20140304         15       15

请问怎么实现?
非常感谢

data  a;
input id var1$  _20140303 _20140304;
cards;
1 价格 10 15
1 收入 11 17
2 价格 1 15
2 收入 2 15
;
run;
data b;set a;if id=1; 
data c;set a; if id =2;
proc transpose data=b out=d_1;
var var1  _20140303 _20140304;
copy id;
run;
proc transpose data=c out=d_2;
var var1  _20140303 _20140304;
copy id;
run;
data e1;set d_1; rename _name_=date col1=price col2=income ;label date="日期"; id=1;if col1='价格' then delete ;run;
data e2;set d_2; rename _name_=date col1=price col2=income ;label date="日期"; id=2;if col1='价格' then delete ;run;
data f;
set e1 e2;
label date= '日期' income='收入' price='价格';
run;


帮师弟处理数据时,遇到的一个问题。

首先看网络上的解决方案:


data score;  将 横向 数据变成 纵向 的结构。

input Student $9. +1 StudentID $ Section $ Test1 Test2 Final;

datalines;

Capalleti 0545 1 94 91 87

Dubose 1252 2 51 65 91

Engles 1167 1 95 97 97

Grant 1230 2 63 75 80

Krupski 2527 2 80 76 71

Lundsford 4860 1 92 40 86

Mcbane 0674 1 75 78 72

;

run;

proc transpose data = score out = score_transposed;

run;

proc print data = score_transposed;

run;

proc transpose data = score out = idnumber name = Test prefix = sn;

run;

proc print data = idnumber noobs;

run;

proc transpose data = score out = idlabel name = Test prefix = sn;

id studentid;

idlabel student;

run;

proc print data = idlabel label noobs;

run;



data fishdata;

infile datalines missover;

input Location & $10. Date date7.

Length1 Weight1 Length2 Weight2 Length3 Weight3

Length4 Weight4;

format date date7.;

datalines;

Cole Pond 2JUN95 31 .25 32 .3 32 .25 33 .3

Cole Pond 3JUL95 33 .32 34 .41 37 .48 32 .28

Cole Pond 4AUG95 29 .23 30 .25 34 .47 32 .3

Eagle Lake 2JUN95 32 .35 32 .25 33 .30

Eagle Lake 3JUL95 30 .20 36 .45

Eagle Lake 4AUG95 33 .30 33 .28 34 .42

;

proc transpose data = fishdata out = fishlength(rename = (col1 = Measurement));

var length1-length4;

by location date;

run;

proc print data = fishlength noobs;

run;



data stocks;

input Company $14. Date $ Time $ Price;

datalines;

Horizon Kites jun11 opening 29

Horizon Kites jun11 noon 27

Horizon Kites jun11 closing 27

Horizon Kites jun12 opening 27

Horizon Kites jun12 noon 28

Horizon Kites jun12 closing 30

SkyHi Kites jun11 opening 43

SkyHi Kites jun11 noon 43

SkyHi Kites jun11 closing 44

SkyHi Kites jun12 opening 44

SkyHi Kites jun12 noon 45

SkyHi Kites jun12 closing 45

;

proc transpose data = stocks out = close let;

by company;

id date;

run;

proc print data = close noobs;

run;

data weights;

input Program $ s1-s7;

datalines;

CONT 85 85 86 85 87 86 87

CONT 80 79 79 78 78 79 78

CONT 78 77 77 77 76 76 77

CONT 84 84 85 84 83 84 85

CONT 80 81 80 80 79 79 80

RI 79 79 79 80 80 78 80

RI 83 83 85 85 86 87 87

RI 81 83 82 82 83 83 82

RI 81 81 81 82 82 83 81

RI 80 81 82 82 82 84 86

WI 84 85 84 83 83 83 84

WI 74 75 75 76 75 76 76

WI 83 84 82 81 83 83 82

WI 86 87 87 87 87 87 86

WI 82 83 84 85 84 85 86

;

data split;

set weights;

array s{7} s1-s7;

Subject + 1;

do Time = 1 to 7;

Strength = s{time};

output;

end;

drop s1-s7;

run;

proc print data=split noobs;

run;

proc transpose data = split out = totsplit prefix = Str;

by program subject;

copy time strength;

var strength;

run;

proc print data = totsplit;

run;


师弟的例子:将 横向 数据变成 纵向 的结构。

PROC IMPORT OUT=weights

            DATAFILE= "D:\0218.txt"

            DBMS=TAB REPLACE;

     GETNAMES=YES;

     DATAROW=2;

RUN;


data split;

set weights;

array s{5} car1-car5;

Subject + 1;

do Time = 1 to 5;

car = s{time};

output;

end;

drop s1-s5;

run;


proc print data=split noobs;

run;


proc transpose data = split out = totsplit prefix = Str;

by   subject;

copy  time  v1 firm v3 v4 v5 v6 v7 v9 industry date v13 v14 v15 vcpe car;

var car;

run;


proc print data = totsplit;

run;


PROC EXPORT DATA=totsplit

            OUTFILE= "D:\02.csv"

            DBMS=CSV  REPLACE;

RUN;



PROC EXPORT DATA=split

            OUTFILE= "D:\01.csv"

            DBMS=CSV  REPLACE;

RUN;


张岚的中日贸易数据也遇到了这个问题:将 纵向 数据变成 横向 的结构。
data a1;
set a;
trade=input(TradeValue_in_1000_USD,20.4) ;
run;


proc summary data=a1  nway nmiss;
class year reportername tradeflowcode;
var trade;
output out=b(drop=_:)
sum(trade)=sum_trade;
run;


proc transpose data =b   out =c  let;
by reportername year ;
id tradeflowcode;
run;


data c1(drop=_name_);
set c;
rename _1=import  _2=export reportername=country;
run;

1http://bbs.pinggu.org/thread-2943262-1-1.html

有数据集a如下:
mark   type   money
1077   50177.87
1077   6510.18
1077   100
1077   180845
1119   234
1119   90
1119   87
20       65
20       89
想输出下面的结果:
                                                                             5
1077      50177.87        6510.18            100            180845
1119      234                                          90               87
20          65                                                               89
求大大帮忙,万分感谢!

 

data a;
        input mark $5.  type   money 8.;
        cards;
1077   50177.87
1077   6510.18
1077   100
1077   180845
1119   234
1119   90
1119   87
20       65
20       89
;
run;
proc sort data=a;by mark;run;
proc transpose data=a out=b;
        by mark;
        id type;
        var money;
run;

 


0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有