楼主: 1017801689
2284 5

[SAS EM] SAS数据集如何循环获取列数据集,求大神帮忙 [推广有奖]

  • 0关注
  • 0粉丝

高中生

55%

还不是VIP/贵宾

-

威望
0
论坛币
0 个
通用积分
0.0000
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
40 点
帖子
1
精华
0
在线时间
68 小时
注册时间
2017-4-28
最后登录
2024-4-7

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
已知一个数据集A,有很多列(62行,37列),如何获取新的37个数据集,这些新的数据集分别取第一列和第二列、第一列和第三列、第一列和第四列,一直下去到最后的第一列和第37列(说明:不能用keep=变量名称的方式获取,因不知道列名,枚举太多了)!!!请大神帮忙,非常感谢
二维码

扫码加我 拉你入群

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

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

关键词:sas数据集 数据集 非常感谢 keep 不能用

沙发
孤单的我们 发表于 2020-9-21 17:07:26 |只看作者 |坛友微信交流群
keep是肯定要keep的,不存在无法枚举的问题。按dictionary.columns里的varnum把变量名做成list,然后宏循环keep即可。

使用道具

藤椅
whymath 发表于 2020-9-21 22:59:35 |只看作者 |坛友微信交流群
按照你的规则,37列的原始数据集应该分割为36个小数据集才对,不是37个。

编写程序如下:
  1. %macro Ds_SplitByVar(Base,Rule);
  2. /*默认规则:分裂后的第i个子数据集选取Base数据集的第1个变量和第i+1个变量*/

  3. %local varnum varlist;

  4. /*1. 获取Base数据集的变量列表*/
  5. %let rc = %sysfunc(open(&Base));
  6. %if &rc %then %do;
  7.         %let varnum = %sysfunc(attrn(&rc,nvars));
  8.         %do i = 1 %to &varnum;
  9.                 %let varlist = &varlist %sysfunc(varname(&rc,&i));
  10.         %end;
  11.         %let rc = %sysfunc(close(&rc));
  12. %end;

  13. /*2. 执行varnum-1次循环, 将Base数据集按照Rule分割到子数据集中*/
  14. %do i = 2 %to &varnum;
  15.         data work.%scan(&Base,-1)&i;
  16.                 set &Base;
  17.                 keep %scan(&varlist,1) %scan(&varlist,&i);
  18.         run;
  19. %end;
  20. %mend;

  21. 测试用例:
  22. %Ds_SplitByVar(Base=sashelp.class);
复制代码

使用道具

板凳
xiaopingN 发表于 2020-9-21 23:32:03 |只看作者 |坛友微信交流群
%Macro subDataset;
%do i=1 %to 37;
Proc sql;
select name into :vname&i
from   dictionary.columns
where  UPCASE(libname)="MYLIB" and UPCASE(memname)="MYDATASET"
    and varnum in (&i);
quit;
%end;
%do j=2 %to 37;
data want&J;
set MYLIB.MYDATASET(keep=&vname1 &&vname&j);
run;
%end;
%mend;
%subDataset;

使用道具

报纸
hlg11 发表于 2020-9-24 16:19:26 |只看作者 |坛友微信交流群
  1. /*假设表名为class2*/
  2. %let table=class2;
  3. proc contents data=&table. out=class_vname(keep=Name) noprint;
  4. run;

  5. data _null_;
  6. set class_vname end=last;
  7. call symput("vname"||compress(_n_),name);
  8. if last then call symput("vnamen",compress(_n_));
  9. %put &vname1 &vnamen ;
  10. run;

  11. %macro class ();
  12. %do i =2 %to &vnamen %by 1;
  13.         data class2_&&&vname&i ;
  14.                 set class2;
  15.                 keep &vname1 &&&vname&i ;
  16.                 run;
  17. %end;
  18. %mend class;
  19. %class;
复制代码

使用道具

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

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

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

GMT+8, 2024-4-25 00:01