全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 SAS专版
2279 3
2018-01-08
悬赏 10 个论坛币 已解决
我自己编了一个小程序,可以实现我的目的。但是当VAR2数据太多时,下面的程序据不能用了。因为宏变量有字符限制。我想请教一下,如果var2数据很多,比如有十万个观测,这时如何实现下面程序同样的效果?
我用自己的数据时,因为数据量太大出现报错。报错的图见下面。


1    /*我自己编了一个小程序,可以实现我的目的。但是当VAR2数据太多时,下面的程序据不能用了。因为宏变量有字符限制。我想请教一下,如果var2数据很多,比如有十万个观测,这时如何实现下面程序同样的效果?*/
2
3    data test;
4    input var1$ var2$ ;
5    cards;

NOTE: 数据集 WORK.TEST 有 5 个观测和 2 个变量。
NOTE: “DATA 语句”所用时间(总处理时间):
      实际时间          0.04 秒
      CPU 时间          0.06 秒


11   ;
12   run;
13   data test1;
14    set test;
15    keep var1;
16   run;

NOTE: 从数据集 WORK.TEST. 读取了 5 个观测
NOTE: 数据集 WORK.TEST1 有 5 个观测和 1 个变量。
NOTE: “DATA 语句”所用时间(总处理时间):
      实际时间          0.04 秒
      CPU 时间          0.03 秒


17   data test2;
18    set test;
19    keep var2;
20   run;

NOTE: 从数据集 WORK.TEST. 读取了 5 个观测
NOTE: 数据集 WORK.TEST2 有 5 个观测和 1 个变量。
NOTE: “DATA 语句”所用时间(总处理时间):
      实际时间          0.04 秒
      CPU 时间          0.04 秒


21
22   %Macro recog(objecet,list,var1,var2);
23   proc sql noprint;
24        select distinct &var2 into :chkvar separated by '|'
25        from &list;
26   quit;
27
28   data &objecet;
29       set &objecet;
30           retain pattern n;
31           if _n_=1 then do;
32               pattern=prxparse("/(&chkvar)/");
33                   n=count("&chkvar",'|')+1;
34           end;
35       if prxmatch(pattern,&var1) then
36           do i=1 to n;
37                           match=scan("&chkvar",i,'|');
38                           if index(&var1,strip(match)) then output;
39                   end;
40           else
41                   do;
42                       delete; /*match="无匹配信息";*/
43                       output;
44                   end;
45           drop pattern n i;
46   run;
47   %mend recog;
48   %recog(test1,test2,var1,var2);
NOTE: “PROCEDURE SQL”所用时间(总处理时间):
      实际时间          0.01 秒
      CPU 时间          0.03 秒



NOTE: 从数据集 WORK.TEST1. 读取了 5 个观测
NOTE: 数据集 WORK.TEST1 有 7 个观测和 2 个变量。
NOTE: “DATA 语句”所用时间(总处理时间):
      实际时间          0.02 秒
      CPU 时间          0.03 秒
无标题.png





二维码

扫码加我 拉你入群

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

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

全部回复
2018-1-8 12:01:11
复制代码
二维码

扫码加我 拉你入群

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

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

2018-1-8 12:04:45
为便于大家指教,我附上完整程序。
data test;
input var1$ var2$ ;
cards;
aab a
aac b
def ac
efg ab
bfc aac
;
run;
data test1;
set test;
keep var1;
run;
data test2;
set test;
keep var2;
run;

%Macro recog(objecet,list,var1,var2);
proc sql noprint;
     select distinct &var2 into :chkvar separated by '|'
     from &list;
quit;

data &objecet;
    set &objecet;
        retain pattern n;
        if _n_=1 then do;
            pattern=prxparse("/(&chkvar)/");
                n=count("&chkvar",'|')+1;
        end;
    if prxmatch(pattern,&var1) then
        do i=1 to n;
                        match=scan("&chkvar",i,'|');
                        if index(&var1,strip(match)) then output;
                end;
        else
                do;
                    delete; /*match="无匹配信息";*/
                    output;
                end;
        drop pattern n i;
run;
%mend recog;
%recog(test1,test2,var1,var2);
二维码

扫码加我 拉你入群

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

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

2018-1-8 17:26:54
复制代码
二维码

扫码加我 拉你入群

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

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

栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群