楼主: priss111
4776 22

[原创博文] 请问如何按照BY组把其中某几个变量由列同时变成一行?谢谢! [推广有奖]

  • 0关注
  • 5粉丝

已卖:9份资源

副教授

16%

还不是VIP/贵宾

-

威望
0
论坛币
153 个
通用积分
47.5396
学术水平
11 点
热心指数
14 点
信用等级
10 点
经验
14935 点
帖子
472
精华
0
在线时间
808 小时
注册时间
2008-3-30
最后登录
2025-3-17

楼主
priss111 发表于 2011-9-16 17:18:05 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
请教各位老师如下问题,谢谢!
如何从数据集aa生成数据集b?
说明如下,
cardid & symp为字符变量,
其余为数字或日期变量,
按照cardid & flwdate排序后,
每一个cardid可能有不只一个flwdate、cd4及symp,
如何把by组的cardid后面的其他几个变量由多列列变成一行?
数据集见附件。


  1. data aa;
  2. input cardid;

  3. cards;
  4. -149042        346        2009/12/16        2010/1/28        1
  5. -149042        307        2010/7/13        2010/7/28        1
  6. -149042        307        2010/7/13        2010/12/16        1
  7. -149042        248        2011/1/15        2011/3/16        1
  8. -149042        222        2011/4/27        2011/6/16        1
  9. ;
  10. run;
复制代码
  1. data b;
  2. input cardid $ cd4 datecd4 flwdate symp $ cd41 datecd41 flwdate1 symp1 $
  3. cd42 datecd42 flwdate2 symp2 $ cd43 datecd43 flwdate3 symp3 $ cd44 datecd44 flwdate4 symp4 $ @@;
  4. cards;
  5. -149042 346 2009/12/16 2010/1/28 1 307 2010/7/13 2010/7/28 1 307 2010/7/13 2010/12/16 1 248 2011/1/15 2011/3/16 1 222 2011/4/27 2011/6/16 1
  6. ;
  7. run;
复制代码
二维码

扫码加我 拉你入群

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

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

关键词:Input cards date card Data 如何

回帖推荐

webgu 发表于2楼  查看完整内容

proc transpose 再merge吧。BTW,楼主用的好像AIDS数据,在疾控工作?

本帖被以下文库推荐

沙发
webgu 发表于 2011-9-16 20:38:41
proc transpose 再merge吧。
  1. data have;
  2.   set have(where=(cd4^=.));
  3. run;
  4. proc sort data=have ;
  5.   by cardid;
  6. run;


  7. proc transpose data=have out=want1 (drop=_name_)  prefix=cd4_;
  8.   var cd4;
  9.   by cardid;
  10. run;

  11. proc transpose data=have out=want2 (drop=_name_)  prefix=datecd4_;
  12.   var datecd4;
  13.   by cardid;
  14. run;

  15. proc transpose data=have out=want3 (drop=_name_)  prefix=flwdate_;
  16.   var flwdate;
  17.   by cardid;
  18. run;

  19. proc transpose data=have out=want4 (drop=_name_)  prefix=symp_;
  20.   var symp;
  21.   by cardid;
  22. run;

  23. data want;
  24.   merge want1 want2 want3 want4;
  25.   by cardid;
  26. run;
复制代码
BTW,楼主用的好像AIDS数据,在疾控工作?
已有 1 人评分经验 论坛币 收起 理由
bakoll + 3 + 3 精彩帖子

总评分: 经验 + 3  论坛币 + 3   查看全部评分

SAS资源
1. SAS 微信:StatsThinking
2. SAS QQ群:348941365

藤椅
jingju11 发表于 2011-9-16 21:19:28
1.我就死活没有理解你的问题。。。“由多列列变成一行?”。symp代表什么?
2.BTW,楼主用的好像AIDS数据,在疾控工作?
京剧

板凳
webgu 发表于 2011-9-16 21:27:10
jingju11 发表于 2011-9-16 21:19
1.我就死活没有理解你的问题。。。“由多列列变成一行?”。symp代表什么?
2.BTW,楼主用的好像AIDS数据, ...
symp 可能是symptom的缩写吧,我也只是看到CD4了猜测的。
已有 1 人评分学术水平 热心指数 收起 理由
jingju11 + 1 + 1 好好好

总评分: 学术水平 + 1  热心指数 + 1   查看全部评分

SAS资源
1. SAS 微信:StatsThinking
2. SAS QQ群:348941365

报纸
jingju11 发表于 2011-9-16 21:49:28
webgu 发表于 2011-9-16 21:27
symp 可能是symptom的缩写吧,我也只是看到CD4了猜测的。
看了半天webgu的程序才理解了你的要求。他的程序很好很正确。也有一些能(改)动的地方:
1. where =(cd4^=.)?
2. sort by cardid? +flwdate?
3.prefix =cd4_ ? or prefix =cd4 等等;
京剧

地板
priss111 发表于 2011-9-16 22:19:23
webgu 发表于 2011-9-16 20:38
proc transpose 再merge吧。BTW,楼主用的好像AIDS数据,在疾控工作?
谢谢!!!

这个问题我还没有分析完...

7
priss111 发表于 2011-9-16 22:39:07
jingju11 发表于 2011-9-16 21:19
1.我就死活没有理解你的问题。。。“由多列列变成一行?”。symp代表什么?
2.BTW,楼主用的好像AIDS数据, ...
一个cardid可能有几次的检测日期,
导致同一个cardid就可能有几次CD细胞个数或者几次symp,
CD细胞个数出现的次数与symp出现的次数没有关系,
现在想要列一个CD细胞个数的有无与symp有无的2分类配对四个表,
                symp
cd4            有                   无
有              a                     b
无              c                     d

如果某一个cardid 有3个观测(3次检测)
if  cd4_1 ne .  or cd4_2 ne . or cd4_3ne. then cd4_all='有';
else cd4_all='无';

if  symp_1 ne '1' or symp_1 ne '' or symp_2 ne '1' or symp_2 ne ''  or symp_3 ne '1' or symp_3 ne ''  then symp_all=有';
else symp_all='无';

那么此cardid 就由原来的3条观测(3行)变为1条观测(1行),
就得到a/b/c/d任一一种情况的一次频数。


所以实际上不论cd4是否为缺失或者symp是否为空白都应该保留在原始数据库中用于上述if-then条件的设置.

不知道这样解释是不是能够被各位老师理解?




8
priss111 发表于 2011-9-16 22:50:32
jingju11 发表于 2011-9-16 21:49
看了半天webgu的程序才理解了你的要求。他的程序很好很正确。也有一些能(改)动的地方:
1. where =(cd4^ ...
谢谢!!!


1.是说要cd4 ne .没用(cd4=.也是用于下面的if then语句的,所以前面不能把它排除)?
2.是说
proc sort ;
by cardid flwdate; /*而不只是 by cardid;的意思?*/
3.是说
prefix 是否直接改为 cd4而不是cd4_?

9
jingju11 发表于 2011-9-16 23:02:46
priss111 发表于 2011-9-16 22:39
一个cardid可能有几次的检测日期,
导致同一个cardid就可能有几次CD细胞个数或者几次symp,
CD细胞个数 ...
不需要transpose 数据。否则反倒麻烦了。我有些不解的是其中形成2X2表格的实际意义。
京剧
  1. proc sort data =aaa out =aaa1; by cardid; run;
  2. proc format;
  3.         value $sympFmt '1', ' ' ='n' other =' ';
  4. run;
  5. data aaa3;
  6.         length c $1;
  7.         do until(last.cardid);
  8.                 set aaa1; by cardid;
  9.                 s =sum(s, cd4);
  10.                 c =cats(c, put(symp, $sympFmt.));
  11.         end;
  12.         cd4_n =(s >.);
  13.         symp_n =(missing(c));
  14. run;
复制代码
已有 1 人评分学术水平 热心指数 收起 理由
webgu + 1 + 1 last.variable 很强大 ,format用得很巧呀

总评分: 学术水平 + 1  热心指数 + 1   查看全部评分

10
priss111 发表于 2011-9-16 23:22:34
jingju11 发表于 2011-9-16 23:02
不需要transpose 数据。否则反倒麻烦了。我有些不解的是其中形成2X2表格的实际意义。
京剧
谢谢!!!!

这个数据还没有分析完...
等周一再运行一下您的程序,
迫不及待...
我这台电脑上的SAS不能读出有汉字的程序及数据...

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

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-26 06:15