作者tew (咖啡王子)
站内Statistics
标题Re: [问题] SAS资料处理
时间Wed Jun 17 12:04:39 2009
根据前人的提示
底下提供我的做法
修改部分 在最後面执行巨集的指令
%item(3);
因为例子最多只有三种品项
如果超过三个品项 则依照最终品项数目修改
data king ;
input id$ year$ local$ item$ cost;
cards ;
101 1999 台北 蚵仔面线 40
101 1999 台南 棺材板 50
101 1999 淡水 阿给 30
101 2000 日本 拉面 100
102 1999 美浓 纸伞 150
102 1999 台北 牛肉面 100
103 2000 美国 汉堡 200
103 2008 美国 披萨 300
;
proc sort data=king;by id year;
run;
data king;
set king;
retain t 0;
t=t+1;
if year^=lag(year) then t=1;
if id^=lag(id) then t=1;
run;
%macro item(t);
%do i=1 %to &t;
data a&i;
set king;
rename local=local&i
item=item&i
cost=cost&i ;
if t=&i then output;
drop t;
run;
proc sort;by id year;
run;
%end;
data a;
set a1;
run;
%do j=1 %to &t;
data a;
merge a a&j;by id year;
run;
%end;
%mend item;
%item(3);
※ 引述《kingbee ( 将心比心)》之铭言:
: 我只想到变通的方法
: 若单一ID 单一年份 有很多地点和物品时 需要靠MARCO来写
: 但我只把我想法写出来 自己在去修改MARCO吧
: data king ;
: input id$ year$ local$ item$ cost;
: cards ;
: 101 1999 台北 蚵仔面线 40
: 101 1999 台南 棺材板 50
: 101 1999 淡水 阿给 30
: 101 2000 日本 拉面 100
: 102 1999 美浓 纸伞 150
: 102 1999 台北 牛肉面 100
: 103 2000 美国 汉堡 200
: 103 2008 美国 披萨 300
: ;
: proc sort data=king ; by id year local ;
: proc transpose data=king out=ts1;
: by id year;
: var local item cost;
: run;
: data t1;
: set ts1;
: keep id year col1 ;
: run;
: proc sort data=t1 ; by id year;
: proc transpose data=t1 out=f1 PREFIX=var1;
: by id year;
: var col1;
: run;
: data t2;
: set ts1;
: keep id year col2 ;
: run;
: proc sort data=t2 ; by id year;
: proc transpose data=t2 out=f2 PREFIX=var2;
: by id year;
: var col2;
: run;
: data t3;
: set ts1;
: keep id year col3 ;
: run;
: proc sort data=t3 ; by id year;
: proc transpose data=t3 out=f3 PREFIX=var3;
: by id year;
: var col3;
: run;
: proc sort data=f1 ; by id year;
: proc sort data=f2 ; by id year;
: proc sort data=f3 ; by id year;
: data king2;
: merge f1 f2 f3 ; by id year;
: drop _NAME_;
: run;
: 若有其他人有更好的方法也请帮忙了
: ※ 引述《a15321 (a15321)》之铭言:
: : 有个SAS问题卡关多日,想请教板上前辈
: : 我有一笔资料是长这样 (举例)
: : ID 年份 地点 物品 金额
: : ==============================================
: : 101 1999 台北 蚵仔面线 40
: : 101 1999 台南 棺材板 50
: : 101 1999 淡水 阿给 30
: : 101 2000 日本 拉面 100
: : 102 1999 美浓 纸伞 150
: : 102 1999 台北 牛肉面 100
: : 103 2000 美国 汉堡 200
: : 103 2008 美国 披萨 300
: : 希望能弄成以下结果
: : ID 年份 地点1 物品1 金额1 地点2 物品2 金额2 地点3 物品3 金额3
: : =========================================================================
: : 101 1999 台北 蚵仔面线 40 台南 棺材板 50 淡水 阿给 30
: : 101 2000 日本 拉面 100 . . . . . .
: : 102 1999 美浓 纸伞 150 台北 牛肉面 100 . . .
: : 103 2000 美国 汉堡 200 . . . . . .
: : 103 2008 美国 披萨 300 . . . . . .
: : 原资料有上万笔
: : 希望把所有 同ID且同年份 的项目合成一项
: : 後面就把项目改成 地点1,物品1,金额1....直到 地点n,物品n,金额n
: : 我试了几天,用PROC Transpose或PROC SQL都做不出来
: : 请问这在SAS中有办法做吗? 请各位前辈指点一下,感激不尽!
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 125.225.32.129
1F:推 west1996:推 06/17 16:01
※ 编辑: tew 来自: 125.225.32.129 (06/17 19:26)
2F:推 a15321:非常受用,感谢 m(_ _)m 06/19 16:03