楼主: zjy1991
1502 2

求不用transpose写转置的方法! [推广有奖]

  • 0关注
  • 0粉丝

初中生

76%

还不是VIP/贵宾

-

威望
0
论坛币
505 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
173 点
帖子
3
精华
0
在线时间
31 小时
注册时间
2013-9-26
最后登录
2020-5-14

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
求大神指点,将如下数据形式

namea b
x 2 4
x 3 2
x 4 4
y 5 1
y 6 2
y 7 1
转成如下形式:
name_name_ col1col2 col3
x a 2 3 4
xb 4 2 4
ya 5 6 7
y b 1 2 1
但是要用data步的方法,不用transpose来写~

谢谢!急
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:Transpose Trans pose RAN ans

  1. data a;
  2.     input name $ a b ;
  3.     cards;
  4. x         2         4
  5. x         3         2
  6. x         4         4
  7. y         5         1
  8. y         6         2
  9. y         7         1
  10. ;
  11. run;
  12. %macro transpose;
  13. proc sql noprint ;
  14.     select count (distinct name) into:name_n  from a;
  15.     select distinct name into: name_ separated by"|" from a;
  16. quit;
  17. %do i = 1 %to &name_n;
  18.     %let _name = %scan("&name_",&i,"|");
  19. proc sql noprint;   
  20.     select count(a) into: na from a where name="&_name" ;
  21.     select name into:name_x from a where name="&_name";
  22.     select a into: aa  separated by "|" from a where name="&_name";
  23.     select count(b) into: nb from a where name="&_name";
  24.     select name into:name_x from a where name="&_name";
  25.     select b into: bb  separated by "|" from a where name="&_name";
  26. quit;
  27. data tmp;
  28.     set a(drop=name);
  29. run;
  30. proc sql noprint;
  31.     select name into:varlist separated by "|" from dictionary.columns
  32.     where libname="WORK" and memname="TMP";
  33. quit;
  34. data _null_ ;
  35.     nvar=count("&varlist","|")+1;
  36.     call symput("nvar",nvar);
  37. run;
  38. %do j=1 %to &nvar;
  39.   %let _var=%scan(%bquote(&varlist),&j,"|");
  40. data b&i.&j.(keep=name _name_ col: );
  41.     name="&_name";
  42.     _name_="&_var";
  43.     array _a[&na]  ;
  44.     array _b[&nb]  ;
  45.     do i = 1 to &na;
  46.         _a[i]=scan("&aa",i,"|");
  47.     end;
  48.     do j = 1 to &nb;
  49.         _b[j]=scan("&bb",j,"|");
  50.     end;
  51.    %do p= 1 %to &&n&_var;
  52.        rename _&_var.&p=col&p;
  53.    %end;
  54.     proc sort nodupkey;by name col:;
  55. run;
  56. %end;
  57. %end;
  58. data wanted ;
  59.     set b:;
  60. run;
  61. %mend transpose;
  62. %transpose
复制代码
hope this will help you well.

使用道具

藤椅
zjy1991 发表于 2015-6-6 13:50:53 |只看作者 |坛友微信交流群
何必不淡定。 发表于 2015-6-6 10:40
hope this will help you well.
这是内置的transpose的算法么?谢大哥!

我自己后来琢磨了下,用data也谢了出来,代码如下:
data quan1;
input name $ a b;
cards;
x 2 4
x 3 2
x 4 4
y 5 1
y 6 2
y 7 1
run;

data quan2(keep=name _name_ new_var);
set quan1;
array v a--b;
do over v;
_name_=vname(v);
new_var=v;
output;
end;
run;

proc sort data=quan2 out=quan3;
by _name_;
run;

data quan4;
array col[3] col1-col3;
do i=1 to 3;
set quan3;
col(i)=new_var;
end;
keep name _name_ col1-col3 ;
run;

但我现在想衍生一下,如果数据是这样:
name a b
   x    2 4
   x    3 2
   x    4 4
   x    1 2
   y    5 1
   y    6 2
   y    7 1
然后用data把他转置成:
name _name_ col1 col2 col3 col4
   x        a        2     3     4     1
   x        b        4     2     4     2
   y        a        5     6     7     .
   y        b        1     2     1     .

不知道该怎么写。。。求教!谢谢

使用道具

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

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-4-19 15:51