2996 10

SAS处理数据时遇到点困难 [推广有奖]

  • 1关注
  • 0粉丝

大专生

90%

还不是VIP/贵宾

-

威望
0
论坛币
158 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
1326 点
帖子
61
精华
0
在线时间
51 小时
注册时间
2015-1-9
最后登录
2017-3-24

20论坛币
现有数据如图,受试者有几千例,只是截了一点。现在想找出每个受试者变量小于基线的,例如1号受试者的基础变量为12,那么小于基础变量的有变量2(值为7),变量4(值为9),变量5(值为3)。如此循环,挑出所有受试者低于基础变量的变量。

11111.GIF (5.44 KB)

11111.GIF

最佳答案

苹果叶 查看完整内容

楼主是想得到低于基础变量的变量名字 还是 只要有一个变量低于基础变量就留下来这一条记录而已?
关键词:SAS处理数据 处理数据

回帖推荐

苹果叶 发表于7楼  查看完整内容

楼主是想得到低于基础变量的变量名字 还是 只要有一个变量低于基础变量就留下来这一条记录而已?
沙发
苹果叶 在职认证  发表于 2015-7-17 15:19:28 |只看作者 |坛友微信交流群
楼主是想得到低于基础变量的变量名字 还是 只要有一个变量低于基础变量就留下来这一条记录而已?
  1. data test;
  2. input id base x1 x2 x3;
  3. cards;
  4. 1 12 4 15 7
  5. 2 10 11 9 8
  6. 3 15 10 14 12
  7. 4 10 16 11 12
  8. ;
  9. run;

  10. /*- first -*/
  11. proc sort data=test;
  12.   by id;
  13. data test1;
  14.   set test;
  15.     by id;
  16.   length varname $200.;
  17.   varname='';

  18.   array var x:;

  19.   do over var;
  20.     if .<var<base then do;
  21.                 varname=catx(', ', varname, vname(var));
  22.         end;
  23.   end;
  24.   if last.id and varname ne '' then output;
  25. run;


  26. /*- last -*/
  27. data test2;
  28. set test;
  29. array x(*) x1-x3;
  30. array b(*) b1-b3;
  31. do i=1 to dim(x);
  32.   if x(i)<base then b(i)=1;
  33.   else if .<base<x(i) then b(i)=0;
  34. end;
  35. if sum(of b1-b3,0)=0 then delete;
  36. drop i b1-b3;
  37. run;
复制代码


已有 1 人评分学术水平 热心指数 收起 理由
Tigflanker + 2 + 2 同样疑问

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

使用道具

后面的省略号代表还有很多变量。急,在线等,谢谢了

使用道具

没人吗

使用道具

报纸
extension 发表于 2015-7-17 16:53:47 |只看作者 |坛友微信交流群
可以用array循环,每次有差值小于0就输出。
  1. data test;
  2. input id base x1 x2 x3;
  3. cards;
  4. 1 12 4 15 7
  5. 2 10 11 9 8
  6. 3 15 10 14 12
  7. ;
  8. run;
  9. data test2(drop=i);
  10. set test;
  11. array x{*} x1-x3;
  12. array d{*} d1-d3;
  13. do i=1 to dim(x);
  14. d(i)=x(i)-base;
  15. if d(i)<0 then output;
  16. end;
  17. run;
复制代码
已有 2 人评分学术水平 热心指数 信用等级 收起 理由
Tigflanker + 2 + 2 热心帮助其他会员
我舅是_黄蓉 + 1 + 1 + 1 精彩帖子

总评分: 学术水平 + 3  热心指数 + 3  信用等级 + 1   查看全部评分

使用道具

extension 发表于 2015-7-17 16:53
可以用array循环,每次有差值小于0就输出。
这样出来的数据集重复的,比如1号受试者有两个不满足,那么就会出来两条记录,但是最后一条记录包含了前面那一条。能不能每个受试者只要最后一条记录呢?

使用道具

7
extension 发表于 2015-7-17 18:48:01 |只看作者 |坛友微信交流群
如果只保留最后一条记录,把上面生成的数据集排序,再加个data步输出一下即可。

其实你的问题可以考虑将数据集转置后处理。

使用道具

8
digiking 发表于 2015-7-19 11:53:45 |只看作者 |坛友微信交流群
我也试试回答下。。。头一次回答。。楼主可以建数量=变量个数的flag类的属性,用case when来判断是否小于基础变量,最后统计的的时候再根据这个flag来统计,横向或者纵向,如果楼主只是想知道对于每个受试者,分别有那些变量(名字)小于基础变量,可以把case when为真的结果赋变量名,最后把所有flag cats起来成为一个field,不知道这样是否可以。。。proc sql;
create table XXX as
select count(受试者编号) as sample_num
           ,sum(case when 变量1<基础变量 then 1 else 0 end ) as flag1
           ,.....
from sas数据集
;
quit;

汇总flag数量等于你的样本数的就是都小于基础变量了,或者proc transpose下。另外如果觉得case when 写起来麻烦可以放在execel 里面用公式拼下,再托一下就可以了。
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
我舅是_黄蓉 + 1 + 1 + 1 精彩帖子

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

使用道具

9
eflucy 发表于 2015-7-20 10:00:35 |只看作者 |坛友微信交流群
假若有n个变量Var_1-Var_n  后面n-1个要与第一个基础变量Var_1比较 能不能建立n-1个新变量做标识,比如 b_2,b_3,...,b_n。 如果Var_i小于Var_1 则b_i=0 否则b_i=1 。最后把全部的b_i 加到一起。

其实还不明白LZ想要的是什么...

使用道具

10
我舅是_黄蓉 发表于 2015-7-20 10:30:15 |只看作者 |坛友微信交流群
苹果叶 发表于 2015-7-19 09:47
楼主是想得到低于基础变量的变量名字 还是 只要有一个变量低于基础变量就留下来这一条记录而已?
就是要test1的结果,谢谢了!!!
朋友,你名字好熟悉啊,是南方医科大的?

使用道具

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

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

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

GMT+8, 2024-4-26 19:25