楼主: suizh
4753 8

[问答] SAS 行列转换 求解答 [推广有奖]

  • 3关注
  • 2粉丝

已卖:19份资源

博士生

53%

还不是VIP/贵宾

-

威望
0
论坛币
0 个
通用积分
6.5001
学术水平
6 点
热心指数
6 点
信用等级
5 点
经验
137 点
帖子
122
精华
0
在线时间
470 小时
注册时间
2012-10-23
最后登录
2025-6-28

楼主
suizh 发表于 2013-7-28 10:23:10 |AI写论文
60论坛币

转置.xls (10.5 KB)

Unnamed.jpg





刚才一贴被删了,,币都没返还。。,,积分换币不容易的。。
重发一下!!
希望好心人能帮忙解答下。。

最佳答案

stata18 查看完整内容

再稍微完善一点。期待其他朋友给出更完美的方案。 data a; input id week amount; cards; 1 2 56 1 2 56 1 2 7 1 4 656 1 4 34 1 6 33 1 7 34 2 1 43 2 1 3 2 1 3 2 4 3 2 5 2 2 5 234 3 2 3 3 ...
关键词:求解答 SOSO 好心人 sos 好心人
已有 1 人评分经验 论坛币 学术水平 热心指数 信用等级 收起 理由
Imasasor + 80 + 80 + 4 + 3 + 4 观点有启发,还给你

总评分: 经验 + 80  论坛币 + 80  学术水平 + 4  热心指数 + 3  信用等级 + 4   查看全部评分

沙发
stata18 发表于 2013-7-28 10:23:11
再稍微完善一点。期待其他朋友给出更完美的方案。

data a;
input id week amount;
cards;
1        2        56
1        2        56
1        2        7
1        4        656
1        4        34
1        6        33
1        7        34
2        1        43
2        1        3
2        1        3
2        4        3
2        5        2
2        5        234
3        2        3
3        2        22
3        2        34
3        7        4
3        7        32
;
run;
data b;set a;
/*
if first.id then n=0;
if first.id & first.week then n=1;
retain n;
if ^first.id & first.week then n+1;
by id week;
run;
data b;set b;
*/
if first.week then m=0;
m+1;
by id week;
run;

data b;set b end=lst;
if _n_=1 then max=m;
retain max;
if m>max then max=m;
if lst then call symput('max',left(max));
drop max;
run;
%put &max;

data ord;set a;
keep week;
run;
proc sort data=ord nodupkey;by week;run;
proc sql;select cat('week',week) into: wk separated by "," from ord;quit;
%put &wk;

%macro trans;
%do i=1 %to &max;
     data dsn;set b;
     if m=&i;
     run;
     proc transpose data=dsn out=dsn1 prefix=week;
                    by id m;id week;var amount;run;
     proc datasets lib=work;append base=t force data=dsn1;quit;
%end;
proc sql;create table res as select id,&wk from t order by id,m;quit;
%mend trans;
%trans;

“res.sas7bdat"就是最终结果。

藤椅
stata18 发表于 2013-7-28 11:13:55
data a;
input id week amount;
cards;
1        2        56
1        2        56
1        2        7
1        4        656
1        4        34
1        6        33
1        7        34
2        1        43
2        1        3
2        1        3
2        4        3
2        5        2
2        5        234
3        2        3
3        2        22
3        2        34
3        7        4
3        7        32
;
run;proc sort data=a;by id week;run;
data b;set a;
if first.week then m=0;
m+1;
by id week;
run;

data b;set b end=lst;
if _n_=1 then max=m;
retain max;
if m>max then max=m;
if lst then call symput('max',left(max));
drop max;
run;
%put &max;

%macro trans;
%do i=1 %to &max;
     data dsn;set b;
     if m=&i;
     run;
     proc transpose data=dsn out=dsn1 prefix=week;
                    by id;id week;var amount;run;
     proc datasets lib=work;append base=t force data=dsn1;quit;
%end;
proc sort data=t(drop=_name_);by id;run;
%mend trans;
%trans;

已有 1 人评分经验 论坛币 学术水平 热心指数 信用等级 收起 理由
Imasasor + 100 + 100 + 4 + 3 + 4 热心帮助其他会员

总评分: 经验 + 100  论坛币 + 100  学术水平 + 4  热心指数 + 3  信用等级 + 4   查看全部评分

板凳
stata18 发表于 2013-7-28 11:14:35
希望能帮到楼主。这个小程序虽不完美,但是可以解决上述问题。

报纸
suizh 发表于 2013-7-28 12:00:46
感谢下  

地板
wwang111 发表于 2013-7-30 10:22:49
data a;
input id week amount;
cards;
1        2        56
1        2        56
1        2        7
1        4        656
1        4        34
1        6        33
1        7        34
2        1        43
2        1        3
2        1        3
2        4        3
2        5        2
2        5        234
3        2        3
3        2        22
3        2        34
3        7        4
3        7        32
;
proc sort data=a out=a1;
by id week;
run;

data a2;
set a1;
by id week;
if first.week then m=0;
m+1;
run;
proc sql noprint;
select max(m) into: max
from a2;

select distinct cat('week',week) into : week separated by ','
from a2
order by 1;
quit;

%macro trans;
%do i=1 %to &max;
proc transpose data=a2 out=b&i(drop=_name_) prefix=week;
where m=&i;
by id;
var amount;
id week;
run;
%end;
data b;
set
%do i=1 %to &max;
b&i
%end;
;
run;
proc sort data=b;
by id;
run;

proc sql;
create table c as
select id, &week
from b;
quit;

%mend;
%trans
只有一个罗纳尔多

7
zorro999 发表于 2015-3-18 20:56:33
受教了,有用!

8
没人爱的坏小孩 发表于 2016-1-20 14:55:07
这个用transpose不是很简单吗

9
teqel 发表于 2016-1-21 10:05:56
stata18 发表于 2013-7-28 11:14
希望能帮到楼主。这个小程序虽不完美,但是可以解决上述问题。
小鱼儿的头像?

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2026-1-4 02:06