楼主: wind2019
1259 8

[实际应用] 如何筛选含有非数字的变量列表 [推广有奖]

  • 0关注
  • 0粉丝

博士生

90%

还不是VIP/贵宾

-

威望
0
论坛币
876 个
通用积分
4.2645
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
2942 点
帖子
159
精华
0
在线时间
174 小时
注册时间
2019-6-15
最后登录
2024-10-28

2论坛币
数据如下:
data test;
input  (a b c) ($);
cards;
1 2 3
3 4 5
e 没 4
;
run;



需求如下: 筛选包含有非数字的变量列表,并放到宏变量varlist调用,即输出 %varlist= a b 。

注意观测和变量可能不止3个。




关键词:varlist cards Input list card
沙发
乐天天12300 发表于 2021-1-12 17:52:20 |只看作者 |坛友微信交流群
  1. data test;
  2.         input  (a b c d e f) ($);
  3.         cards;
  4. 1 2 3 r t 3
  5. 3 4 5 d 5 4
  6. e 没 4 5 b 4
  7. ;
  8. run;

  9. *把字符变量全部找出来,并赋值给宏变量varname;
  10. proc contents data=test out=type noprint;
  11. run;

  12. proc sql noprint;
  13.         select name into :varname separated by " " from type where type=2;
  14. quit;

  15. *使用数组,如果满足if,则i就是变量在宏变量varname的排序,num里某变量出现次数即为其里面包含字符观测的个数;
  16. data test1;
  17.         set test;
  18.         array varchar{*} &varname.;

  19.         do i=1 to dim(varchar);
  20.                 if prxmatch("/\d/",varchar(i))=0 then
  21.                         do;
  22.                                 num=scan("&varname.", i, " ");
  23.                                 output;
  24.                         end;
  25.         end;
  26.         keep num;
  27. run;

  28. proc sort data=test1 out=test2 nodupkey;
  29.         by num;
  30. run;

  31. proc print data=test2;
  32. run;
复制代码

使用道具

藤椅
wind2019 发表于 2021-1-14 09:02:18 |只看作者 |坛友微信交流群

使用道具

板凳
wind2019 发表于 2021-1-15 08:59:24 |只看作者 |坛友微信交流群
乐天天12300 发表于 2021-1-14 19:41
大牛厉害啊

使用道具

报纸
wind2019 发表于 2021-1-15 15:38:20 |只看作者 |坛友微信交流群
乐天天12300 发表于 2021-1-12 17:52
还有小数点的情况  要怎么用正则表达式剔除掉?

使用道具

地板
乐天天12300 发表于 2021-1-15 16:07:35 |只看作者 |坛友微信交流群
wind2019 发表于 2021-1-15 15:38
还有小数点的情况  要怎么用正则表达式剔除掉?
匹配小数就是小数点前面以数值开头,小数点后面以数值结尾
  1. prxmatch("/^\d+[.]?\d+$/", x)
复制代码

使用道具

7
wind2019 发表于 2021-1-15 16:21:29 |只看作者 |坛友微信交流群
乐天天12300 发表于 2021-1-15 16:07
匹配小数就是小数点前面以数值开头,小数点后面以数值结尾
可以了 谢谢

使用道具

8
wind2019 发表于 2021-1-15 16:26:51 |只看作者 |坛友微信交流群
乐天天12300 发表于 2021-1-15 16:07
匹配小数就是小数点前面以数值开头,小数点后面以数值结尾
还有空值的情况 怎么也剔除掉啊?   快哭了

使用道具

9
缘oO来如此0o 发表于 2021-1-17 00:03:40 |只看作者 |坛友微信交流群
data want;
        set test;
        array chs _character_;
        PRX=PRXPARSE("/\D/");
        prx=prxparse("/^\d+[.\d]?\d?$/");

        do i =1 to dim(chs);
                START=1;
                STOP=LENGTH(chs(i));
                CALL PRXNEXT(PRX,START,STOP,chs(i),POSITION,LENGTH);
                if position=0 then do;
                        x = vname(chs(i));
                        output;
                end;
        end;
run;

使用道具

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

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

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

GMT+8, 2024-11-6 08:07