楼主: yiqiangz
2162 12

请问两个SAS编程的问题(有一个来自京剧的quantile测序)。 [推广有奖]

  • 0关注
  • 0粉丝

大专生

31%

还不是VIP/贵宾

-

威望
0
论坛币
0 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
346 点
帖子
21
精华
0
在线时间
56 小时
注册时间
2014-4-21
最后登录
2021-9-18

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
第一个问题关于输出宏变量的:

先用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排的。

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

二维码

扫码加我 拉你入群

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

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

关键词:quantile SAS编程 quant Tile Ant reference count where

沙发
jingju11 发表于 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).

京剧

使用道具

藤椅
yiqiangz 发表于 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的值...依次类推



使用道具

板凳
jingju11 发表于 2014-4-23 00:16:06 |只看作者 |坛友微信交流群
yiqiangz 发表于 2014-4-22 21:20
非常感谢,

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

使用道具

报纸
yiqiangz 发表于 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]的意义

使用道具

地板
jingju11 发表于 2014-4-23 00:57:46 |只看作者 |坛友微信交流群
  1. do i =1 to &n_obs.;
  2.          value =mean(of &arr_r);
  3.          output;
  4.       end;


  5. 本文来自: 人大经济论坛 SAS专版 版,详细出处参考: https://bbs.pinggu.org/forum.php?mod=viewthread&tid=3009358&page=1&from^^uid=1032463
复制代码


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

使用道具

7
yiqiangz 发表于 2014-4-23 22:05:23 |只看作者 |坛友微信交流群
报错:ERROR Array subscript out of range at line 1 column 2. 然后后面还有一堆错误,数据normalization不成功。

是的,&n_obs > &nid (nid是需要做normalization的变量数,n_obs是每个变量的数据点数,即row数)

%put %nrstr(&nid) &nid.;

&nid       36

%put %nrstr(&n_obs) &n_obs.;

&n_obs 26795

使用道具

8
jingju11 发表于 2014-4-24 05:30:43 |只看作者 |坛友微信交流群
yiqiangz 发表于 2014-4-23 22:05
报错:ERROR Array subscript out of range at line 1 column 2. 然后后面还有一堆错误,数据normalization ...
我的原始代码不保证正确。但是按照我所理解,代码本身应该不会错。我对原始的代码做了进一步的测试, 看起来好像还可以。京剧
I did not see the error from my original code. Here I added some test code.
http://blog.sina.com.cn/s/blog_a3a926360101hbi2.html
jingju

使用道具

9
yiqiangz 发表于 2014-4-25 09:33:11 |只看作者 |坛友微信交流群
你的代码是正确的,我用非数组的方法有写了一个,结果完全一样。只是京剧你用的数组方法中,%let arr_r =&arr_r pre_&i._[i],这里面[i]的作用我实在不懂。换成J, ii, &i均不行。

使用道具

10
jingju11 发表于 2014-4-25 10:10:42 |只看作者 |坛友微信交流群
你一直没有给出你的完整代码,所以很难知道你到底遇到什么问题。但是我觉得你说的不是关键。我没有觉得其中有什么难以理解的。
京剧

使用道具

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

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

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

GMT+8, 2024-5-1 12:07