楼主: shevaze
1165 11

[有偿编程] 如果通过SAS批量匹配文件,求大神帮忙 [推广有奖]

  • 2关注
  • 10粉丝

副教授

75%

还不是VIP/贵宾

-

威望
0
论坛币
2962 个
通用积分
44.2810
学术水平
9 点
热心指数
6 点
信用等级
3 点
经验
87196 点
帖子
720
精华
0
在线时间
1095 小时
注册时间
2010-11-13
最后登录
2022-4-11

100论坛币
详见附件,将原始数据2的姓名一列unique,并在原始数据1中根据性别和省份找到同类,生成n个文件,n为原始数据2的nobs,如果无法匹配,仅输出原始数据2的内容就行

需求.xlsx

9.66 KB

关键词:unique 原始数据 nobs NIQ obs
沙发
孤单的我们 发表于 2020-9-28 11:22:35 |只看作者 |坛友微信交流群
  1. data d1;
  2. input name$ sex$ prov$;
  3. datalines;
  4. 张三 男 山东
  5. 李四 男 江苏
  6. 王五 女 山东
  7. 郑六 女 江苏
  8. 狗蛋 男 山东
  9. 大瓜 女 江苏
  10. 狗娃 男 山东
  11. ;
  12. run;

  13. data d2;
  14. input test$ sex$ prov$;
  15. datalines;
  16. test1 男 山东
  17. test2 男 江苏
  18. test3 女 山东
  19. test4 女 江苏
  20. test5 男 北京
  21. ;
  22. run;

  23. proc sql noprint;
  24. create table d3 as
  25. select distinct a.*,b.test from d1 as a
  26. full join d2 as b
  27. on a.sex eq b.sex and a.prov eq b.prov;
  28. quit;

  29. %macro split;
  30. proc sql noprint;
  31.         select distinct test into: tlst separated by ' ' from d3;
  32. quit;

  33. %let i=1;
  34. %do %while(%scan(&tlst.,&i.,' ') ne );
  35. %let test=%scan(&tlst.,&i.,' ');

  36. proc sql noprint;
  37.         select distinct sum(ifn(not missing(sex),1,0)) into: nobs from d3 where test eq "&test.";
  38. quit;

  39. %if &nobs.>0 %then %do;
  40.         data want&i.;
  41.                 set d3;
  42.                 where test eq "&test.";
  43.                 drop test;
  44.                 rename name=&test.;
  45.         run;
  46. %end;
  47. %else %do;
  48.         data want&i.;
  49.                 set d2;
  50.                 where test eq "&test.";
  51.         run;
  52. %end;
  53. %let i=%eval(&i+1);
  54. %end;
  55. %mend split;
  56. %split;
复制代码




微信图片_20200928142144.png (4.14 KB)

微信图片_20200928142144.png

微信图片_20200928142131.png (3.99 KB)

微信图片_20200928142131.png

微信图片_20200928142117.png (4.57 KB)

微信图片_20200928142117.png

使用道具

藤椅
孤单的我们 发表于 2020-9-28 14:21:46 |只看作者 |坛友微信交流群
网络问题,重复了

codes.txt

1.04 KB

代码无法显示美元符号

使用道具

板凳
孤单的我们 发表于 2020-9-28 14:24:55 |只看作者 |坛友微信交流群
重复了。。

使用道具

报纸
shevaze 发表于 2020-9-28 15:58:59 |只看作者 |坛友微信交流群
孤单的我们 发表于 2020-9-28 14:24
重复了。。
非常感谢!请问如何把test1的内容变成样本,而不是表头呢?

使用道具

地板
孤单的我们 发表于 2020-9-28 16:01:34 |只看作者 |坛友微信交流群
shevaze 发表于 2020-9-28 15:58
非常感谢!请问如何把test1的内容变成样本,而不是表头呢?
你说的样本是什么意思?如果是要在数据里保留test1,去掉drop test;这句就可以了。

使用道具

7
shevaze 发表于 2020-9-28 16:12:26 |只看作者 |坛友微信交流群
孤单的我们 发表于 2020-9-28 16:01
你说的样本是什么意思?如果是要在数据里保留test1,去掉drop test;这句就可以了。
好的!非常感谢!

使用道具

8
shevaze 发表于 2020-9-28 16:46:13 |只看作者 |坛友微信交流群
孤单的我们 发表于 2020-9-28 16:01
你说的样本是什么意思?如果是要在数据里保留test1,去掉drop test;这句就可以了。
抱歉再次打扰,请问如果d2里有性别和省份充分的,也需要匹配,怎么办

需求.xlsx

9.81 KB

使用道具

9
xiaopingN 发表于 2020-9-29 02:13:45 |只看作者 |坛友微信交流群
shevaze 发表于 2020-9-28 16:46
抱歉再次打扰,请问如果d2里有性别和省份充分的,也需要匹配,怎么办
试试下面的code:
data d1;
input name $ sex $ prov $;
datalines;
张三 男 山东
李四 男 江苏
王五 女 山东
郑六 女 江苏
狗蛋 男 山东
大瓜 女 江苏
狗娃 男 山东
;
run;

data d2;
input name $ sex $  prov $;
datalines;
test1 男 山东
test2 男 江苏
test3 女 山东
test4 女 江苏
test5 男 北京
;
run;

proc sort data=d2 nodupkey;
by name;
run;

Data d3;
set d1 d2;
run;

Data IDlist (drop=Name sex prov);
set D2;
N=_N_;
ID=cats(sex, prov);
Run;

%macro DS(N,ID);
Data DS&N;
set D3;
where cats (sex, prov)="&ID";
run;
%mend;

Data _null_;
set IDList;
call execute('%DS('||N||', '||Strip(ID)||');');
run;

使用道具

10
孤单的我们 发表于 2020-9-29 14:04:21 |只看作者 |坛友微信交流群
shevaze 发表于 2020-9-28 16:46
抱歉再次打扰,请问如果d2里有性别和省份充分的,也需要匹配,怎么办
原代码如果d2有重复应该也会自动输出,您可以测试一下

使用道具

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

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

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

GMT+8, 2024-5-1 15:52