楼主: louis_bai
1897 5

[学习分享] 一个变量变为多个变量 [推广有奖]

  • 0关注
  • 1粉丝

本科生

54%

还不是VIP/贵宾

-

威望
0
论坛币
1079 个
通用积分
2.0011
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
867 点
帖子
23
精华
0
在线时间
143 小时
注册时间
2018-7-23
最后登录
2021-3-9

相似文件 换一批

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
目的:
2C4(ZR1UP1]5(GOLUE15U.png
(变成)↓
7Y6NJKL0[0PD3QY6@O((9X6.png
代码:
  1. data dat;
  2.   input group $ X $;
  3.   cards;
  4. A 1
  5. A 2
  6. B 3
  7. B 4
  8. C 5
  9. C 6
  10. ;
  11. run;
  12. data dat1;
  13. set dat;
  14. retain id;
  15. by group;
  16. if first.group then id=1; else id=id+1;
  17. run;
  18. proc sort;by id;run;
  19. data dat2;
  20.   set dat1;
  21.   retain A B C;
  22.   by id;
  23.   if group="A" then do; A=x;output;end;
  24.   if group="B" then do; b=x;output;end;
  25.   if group="C" then do; c=x;output;end;
  26. run;
  27. data dat3;
  28.   set dat2;
  29.   by id;
  30.   if last.id;
  31.   drop x group id ;
  32. run;
复制代码
问题:这种一列变多列的情况,对于每个group有相同的观测数比较理想,但是如果group不同(比如A组有3个,B组有2个),出来的结果会很冗余,希望网友提出解决方法。
要求:不要利用生成多个数据集,然后merge的方法,因为如果组数很多时,会出现大量的中间数据集,是我们不想看到的

二维码

扫码加我 拉你入群

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

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

关键词:多个变量 output RETAIN Group outpu

沙发
steven_1017 发表于 2018-9-19 21:43:19 |只看作者 |坛友微信交流群
每个group2个或者3个,是obs数量还是var数量?能否直接给个datalines的例子?这样方便大家帮忙研究

使用道具

藤椅
louis_bai 在职认证  发表于 2018-9-20 09:43:57 |只看作者 |坛友微信交流群
steven_1017 发表于 2018-9-19 21:43
每个group2个或者3个,是obs数量还是var数量?能否直接给个datalines的例子?这样方便大家帮忙研究
group不同,指的是观测数不同,可见下图,如果仍按之前的程序运行,B组与C组红框中的结果就冗余了,实际上应该为空。对于此例来说,用merge来做很容易,但是如果组数不止三组的话,就要建立很多中间数据集了
}1S_UDBE6FSO@_]SPRHN8.png ↓↓↓↓↓↓↓↓↓变成了这样↓↓↓↓↓↓↓↓↓
(`$Q@]{0S@K435TAQGK4SK5.png

使用道具

板凳
aileen0820 学生认证  发表于 2018-9-20 13:21:14 |只看作者 |坛友微信交流群
如果使用EG,這類型的問題是比較容易解決的
以下是我自己試出來的,可以參考看看
但有使用到Macro和Sql

  1. data dat;
  2.   input group $  X;  cards;
  3. A 1
  4. A 2
  5. B 3
  6. B 4
  7. C 5
  8. C 6
  9. ;
  10. run;
  11. /*
  12. 圖A
  13. 先轉置讓ABC分類
  14. */
  15. proc transpose data = dat; by group;var X;run;
  16. /*
  17. 圖B
  18. 透過分割欄的概念,分別將欄位切割後轉置
  19. */
  20. %macro split(item);
  21. proc sql;create view test&item. as select data1.&item. , data1.group from data1;quit;
  22. proc transpose data = test&item. out = test&item.2; var &item.;id group;run;
  23. %mend;
  24. %split(col1) %split(col2)
  25. /*
  26. 圖C
  27. 最後將轉置後的檔案合併,若使用merge則會回到原來的資料型態,必須使用proc sql
  28. */
  29. proc sql; create table test as select a,b,c  from testcol12 outer union corr select  a,b,c from  testcol22;quit;
复制代码


圖A
圖A.png
圖B
圖B.png
圖C
圖C.png

使用道具

报纸
蓝色 发表于 2018-9-21 08:44:46 |只看作者 |坛友微信交流群
如果是用stata处理,比较简单
  1. clear
  2. input str2 group x
  3. A 1
  4. A 2
  5. A 3
  6. B 4
  7. B 5
  8. C 6
  9. end

  10. bysort group : gen id=_n
  11. reshape wide x,i(id) j(group) str
  12. rename x* *
  13. list
复制代码


下面是命令结果
  1. . clear

  2. . input str2 group x

  3.          group          x
  4.   1. A 1
  5.   2. A 2
  6.   3. A 3
  7.   4. B 4
  8.   5. B 5
  9.   6. C 6
  10.   7. end

  11. .
  12. . bysort group : gen id=_n

  13. . reshape wide x,i(id) j(group) str
  14. (note: j = A B C)

  15. Data                               long   ->   wide
  16. -----------------------------------------------------------------------------
  17. Number of obs.                        6   ->       3
  18. Number of variables                   3   ->       4
  19. j variable (3 values)             group   ->   (dropped)
  20. xij variables:
  21.                                       x   ->   xA xB xC
  22. -----------------------------------------------------------------------------

  23. . rename x* *

  24. . list

  25.      +----------------+
  26.      | id   A   B   C |
  27.      |----------------|
  28.   1. |  1   1   4   6 |
  29.   2. |  2   2   5   . |
  30.   3. |  3   3   .   . |
  31.      +----------------+

  32. .
复制代码





使用道具

地板
steven_1017 发表于 2018-9-21 10:37:07 |只看作者 |坛友微信交流群
  1. /*第一步,先把数据读进来,先运行一下*/
  2. data test1;
  3. input group $  X;  
  4. datalines;
  5. A 1
  6. A 2
  7. A 5
  8. A 9
  9. B 3
  10. B 4
  11. B 2
  12. C 5
  13. C 6
  14. ;
  15. run;

  16. /*第二步,数据转置*/
  17. proc transpose data=test1 out=tran1(drop = _name_);
  18. by group;
  19. var x;
  20. run;

  21. /*第三步,二次转置*/
  22. proc transpose data=tran1;
  23. id group;
  24. var col:;
  25. run;
复制代码
楼主看看,是不是你要的结果?

使用道具

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

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

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

GMT+8, 2024-4-20 14:21