楼主: Tigflanker
1727 6

[原创博文] 【暂时关闭】贡献一个宏,用于从数据集中抽取不同的情况 [推广有奖]

  • 8关注
  • 18粉丝

副教授

49%

还不是VIP/贵宾

-

威望
0
论坛币
2321 个
通用积分
9.9128
学术水平
179 点
热心指数
194 点
信用等级
167 点
经验
27443 点
帖子
622
精华
0
在线时间
851 小时
注册时间
2011-3-27
最后登录
2023-5-14

楼主
Tigflanker 发表于 2015-12-15 20:34:34 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
暂时关闭,我觉得逻辑貌似有疏漏。。
----------------------------------------------------------------------------------

其实一直想写这么一个宏,今天得空写了一下,一开始觉得很难,着手写的时候发现其实挺简单。

目的:
用于从指定数据集中按抽取代表情况。
这样,我们在对一个数据集进行某种规则时,可以先抽取一个全部情况的样本,看看自己的逻辑是否完备。

描述:
大伙都用过PROC SORT的nodupkey吧?他是按照给定的几个字段对数据集进行一条一条的去重;
可是有时我们需要对数据集进行一组一组的去重,以获得一个有代表性的样本数据集。

如下例:

idgroup1group2value

1

1

1

1

1

2

1

2

1

3

1

3

1

3

2

4

1

4

1

5

1

5

1

6

2

11

1

7

2

22

2

8

2

33

3

9

3

1

1

10

3

2

1

11

3

3

1

12

3

3

2

13

3

4

1

14

3

5

1

15

4

11

1

16

4

22

2

17

4

33

3

18

5

11

0

19

5

22

2

20

5

33

3

21



这个例子,如果我们按照group1 + group2来看,id:1、2、5就可以代表这个数据集的不同情况
按照group1来看,id:1、2就可以代表这个数据集的不同情况。

程序:
  1. %macro extract_sample(in = have, out = result, id = id, group = group1 group2);
  2. proc sql;
  3.         create table extract_sample1 as
  4.                 select *, count(*) as extract_sample_N
  5.                         from &in.(keep = &id. &group.)
  6.                 group by &id.
  7.                 order by &id., %sysfunc(tranwrd(%sysfunc(compbl(&group.)),%str( ),%str(,)))
  8.                 ;
  9. quit;

  10. data extract_sample1;
  11.         set extract_sample1;

  12.         by &id.;

  13.         retain extract_sample_id;
  14.         if first.&id. then extract_sample_id = 1;
  15.                 else extract_sample_id + 1;
  16. run;

  17. proc sort data = extract_sample1 out = extract_sample2 nodupkey;
  18.         by extract_sample_N extract_sample_id &group.;
  19. run;

  20. proc sql;
  21.         create table &out. as
  22.         select * from &in.
  23.         where &id. in (select &id. from extract_sample2)
  24.         ;
  25. quit;

  26. proc datasets lib = WORK memtype = data nolist;
  27.         delete extract_sample:;
  28. quit
  29. %mend extract_sample;
  30. %extract_sample(in = have, out = result, id = id, group = group1 group2);
复制代码



二维码

扫码加我 拉你入群

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

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

关键词:数据集 NODUPKEY proc sql datasets extract 样本

Bye SAS.
若有缘,能重聚。

沙发
yunnandlg 在职认证  学生认证  发表于 2015-12-17 00:07:47 来自手机
Tigflanker 发表于 2015-12-15 20:34
其实一直想写这么一个宏,今天得空写了一下,一开始觉得很难,着手写的时候发现其实挺简单。

目的:
宏功能太强大啦
已有 1 人评分论坛币 学术水平 热心指数 信用等级 收起 理由
Tigflanker + 5 + 4 + 4 + 4 谢谢

总评分: 论坛币 + 5  学术水平 + 4  热心指数 + 4  信用等级 + 4   查看全部评分

藤椅
yunnandlg 在职认证  学生认证  发表于 2015-12-17 08:57:11
谢谢楼主,多多向你们学习

板凳
孤单的我们 发表于 2015-12-17 09:16:50
已有 1 人评分论坛币 学术水平 热心指数 信用等级 收起 理由
Tigflanker + 5 + 1 + 2 + 3 谢谢

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

报纸
Tigflanker 发表于 2015-12-17 10:03:02
写这个程序的动机是:

对于某些临床试验的随访资料,每个病人一般来说都有(假说)7次访视,visit1 - visit7,
有些病人可能来不全,例如有一部分病人就是单单缺少访视3、访视4的资料,
也有些病人在访视5可能来了3次。

这个程序的祈愿就是能观察数据可能出现的情况,按照某种固定形式的数据,每个人各有不同,都有哪些变异,
下一步可能会考虑加上每组情况出现的频次;不过算法恐怕就不能这么简单了。

地板
teqel 发表于 2015-12-17 11:26:59
有个疑问:你这个例子是前面的ID把后面的ID给覆盖了,所以能去掉后面重复的ID。如果前面的组合比后面的小,则两个都会保留?
已有 1 人评分论坛币 学术水平 热心指数 信用等级 收起 理由
Tigflanker + 5 + 4 + 4 + 4 感谢关注

总评分: 论坛币 + 5  学术水平 + 4  热心指数 + 4  信用等级 + 4   查看全部评分

7
Tigflanker 发表于 2015-12-17 13:32:59
teqel 发表于 2015-12-17 11:26
有个疑问:你这个例子是前面的ID把后面的ID给覆盖了,所以能去掉后面重复的ID。如果前面的组合比后面的小 ...
我的例子有个变量是N,就是把每组的例数统计,保证在每组内进行的差异比较
不过我逻辑疏漏的是
IDGROUP1GROUP2VALUE

1

1

1

1

1

2

a

2

1

3

s

3

2

1

1

4

2

2

q

5

2

3

w

6

3

1

1

7

3

2

a

8

3

3

w

9

这种的话,我的ID3就被ID1 + ID2吞掉了;
我觉得每组的组数加上group值已经可以突显出每组的特征,可惜还是会出现拼凑的状态。
Bye SAS.
若有缘,能重聚。

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

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