SAS中文论坛

 找回密码
 立即注册

扫一扫,访问微社区

查看: 1415|回复: 4
打印 上一主题 下一主题

求助:转换数据形式

[复制链接]

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
楼主
 楼主| 发表于 2003-12-25 13:43:03 | 只看该作者

求助:转换数据形式

case  a    b    id   
1     34   0    33004
1     35   0    33004
1     36   0    33004
1     37   0    33004
2     34   0    33006
2     35   0    33006
2     36   0    33006
2     37   0    33006
3     34   0    33100
3     35   0    33100
3     36   0    33100
3     37   0    33100

如何在sas中转为


case  id        a34  b34   a35  b35  a36  b36  a37  b37
1     33004    34     0      35    0    36     0     37    0
2     33006    34     0      35    0    36     0     37    0
3     33100    34     0      35    0    36     0     37    0
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
沙发
 楼主| 发表于 2003-12-25 17:25:05 | 只看该作者
不太清楚你的需求,不知道这样能满足吗?
data aaa;
input case a b id;
cards;
1 34 0 33004
1 35 0 33004
1 36 0 33004
1 37 0 33004
2 34 0 33006
2 35 0 33006
2 36 0 33006
2 37 0 33006
3 34 0 33100
3 35 0 33100
3 36 0 33100
3 37 0 33100
;
run;
data bbb;
set aaa;
a1 = 34;
b1 = 0;
a2 = 35;
b2 = 0;
a3 = 36;
b3 = 0;
a4 =37;
b4 = 0;
run;
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
板凳
 楼主| 发表于 2003-12-25 20:14:41 | 只看该作者
此问题虽然简单,但有一定的代表性。就现有问题,有很多简单的实现方法,但扩展到同类问题的更为复杂的情况就有很多的局限性。

以下给出解决此类问题的一般方法,不足之处希望各位多多指点。

data temp;
input case a b id;
datalines;
1 34 0 33004
1 35 0 33004
1 36 0 33004
1 37 0 33004
2 34 0 33006
2 35 0 33006
2 36 0 33006
2 37 0 33006
3 34 0 33100
3 35 0 33100
3 36 0 33100
3 37 0 33100
;
proc sort data=temp;
  by case;
run;
data temp1;
  set temp;
  retain a1 b1 a2 b2 a3 b3 a4 b4;
  by case;
  array x(0:3) a1-a4;
  array y(0:3) b1-b4;
  x(mod((_n_-1),4))=a;
  y(mod((_n_-1),4))=b;
  if not(last.case) then delete;
  drop a b;
run;
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
地板
 楼主| 发表于 2003-12-29 22:26:45 | 只看该作者

proc transpose

proc transpose data=_temp
               out=_temp2;
               id a;
run;
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
5#
 楼主| 发表于 2004-1-11 00:47:11 | 只看该作者

答: 转换数据形式

那个问题本身问得不好,给出的数据也许不能说明你的问题,但仍有答案.希望你能看懂下面的程序.


data temp;
input case a b id;
cards;
1 34 0 33004
1 35 0 33004
1 36 0 33004
1 37 0 33004
2 34 0 33006
2 35 0 33006
2 36 0 33006
2 37 0 33006
3 34 0 33100
3 35 0 33100
3 36 0 33100
3 37 0 33100
;
run;

%macro fmt;

proc sql noprint;
select left(put(count(*),4.)) into :n
from (select distinct a
      from temp);
select distinct a into :a1 - :a&n
from temp;
quit;

data temp1(drop=a b);
retain
  %do i=1 %to &n;
     a&&a&i b&&a&i
  %end; ;
set temp;
by case id;
  if first.case then do;
    %do i=1 %to &n;
       a&&a&i=.; b&&a&i=.;
    %end;
  end;
    %do i=1 %to &n;
       if a=&&a&i. then do;
         a&&a&i = a;
         b&&a&i = b;
       end;
    %end;

if last.id then output;
run;

%mend;

%fmt;
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|小黑屋|手机版|Archiver|SAS中文论坛  

GMT+8, 2025-1-7 12:43 , Processed in 0.131362 second(s), 20 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表