全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 SAS专版
2562 12
2014-04-21
第一个问题关于输出宏变量的:

先用proc sql产生了一些宏变量:

proc sql noprint;
    select count(distinct name) into:nid from summary where name^="ID";
    select name into :id1-:id%left(&nid) from summary where name^="ID";
quit;

现在想得到最后一个变量名,用%put &&id%left(&nid)不能得到正确的结果:


%put &&id%left(&nid) ;
WARNING: Apparent symbolic reference ID not resolved.
&id3


而用下面两步就可以:
%let maxn=%left(&nid);
%put &&id&maxn.

A3810_gg4


请问怎么能一次得到?

=========================
第二个问题关于临时数组的应用:


%do i =1 %to &nid;
  %let arr_r =&arr_r pre_&i._[i];
%end;

data data;
    set raw_data end =Eof;

    ...

    %do i =1 %to &nid;
      array pre_&i._[&n_obs.] _temporary_;
      pre_&i._[_n_] =&&id&i.;
    %end;

    if Eof then do;

      %do i =1 %to &nid;
         call sortn(of pre_&i._[*]);
      %end;

      do i =1 to &n_obs.;
         value =mean(of &arr_r);
         output;
      end;

    end;
...
run;

请问这里面:_[i]代表什么意思?_[*]代表所有数组元素吗?再就是这里为什么可以
mean(of &arr_r)这么用?记得以前用call sortn(of a b c)都是每个row排的。

多谢了。如果京剧大师能点拨一下,那感激不尽。

二维码

扫码加我 拉你入群

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

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

全部回复
2014-4-21 22:57:07
(1)%put %unquote(%quote(&)id%left(&nid)); 可以强迫解析.当然也可以通过创建'字符'宏变量来左对齐.比如:
select count(distinct name) into:nid separated by ','...
(2)你的理解都是对的.[*]代表所有数组元素.call sortn(of a[*])都是每个row排的.mean(of list-of-variables).

京剧
二维码

扫码加我 拉你入群

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

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

2014-4-22 21:20:24
非常感谢,

1,按照这个方法,解析成功。
2,有两处不是很明白:A: %let arr_r =&arr_r pre_&i._[i];  和  B: pre_&i._[_n_] =&&id&i.;

A处,临时数组pre_&i._后面跟的[i]代表什么意思?我之前以为仅用来做标记,但是发现把 i 换成其他就会出错。
B处,在这个数据集里, pre_&i._[_n_] =&&id&i.相当于把数据集中的每个变量每个row的数据依次放到临时数据pre_&i._中吗?也就是说 pre_&i._[1] 为&&id&i.变量的第一个row的值,也就是说 pre_&i._[2] 为&&id&i.变量的第二个row的值...依次类推



二维码

扫码加我 拉你入群

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

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

2014-4-23 00:16:06
yiqiangz 发表于 2014-4-22 21:20
非常感谢,

1,按照这个方法,解析成功。
临时数组需要用类似x来索引.其中的i当然可以改变.但是在以上的程序里是用i来循环的.
是的.的确如此.
京剧
二维码

扫码加我 拉你入群

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

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

2014-4-23 00:38:17
可是我试了一下:

%do ii =1 %to &nid;
  %let arr_r =&arr_r pre_&ii._[ii];
%end;

或者

%do i =1 %to &nid;
  %let arr_r =&arr_r pre_&i._[x];
%end;

都会报错,最先出来的错误是这样的:ERROR Array subscript out of range at line 1 column 2.

所以,我觉得我还是没有理解这里[i]的意义
二维码

扫码加我 拉你入群

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

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

2014-4-23 00:57:46
复制代码


报错? &n_obs > &nid ?这不行.京剧
二维码

扫码加我 拉你入群

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

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

点击查看更多内容…
相关推荐
栏目导航
热门文章
推荐文章

分享

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