请选择 进入手机版 | 继续访问电脑版
楼主: czd19840303
5306 12

SAS求教 - 将一个数据集变量所有观测值作为条件变量进行循环 [推广有奖]

  • 0关注
  • 1粉丝

大专生

16%

还不是VIP/贵宾

-

威望
0
论坛币
3 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
72 点
帖子
0
精华
0
在线时间
77 小时
注册时间
2005-9-15
最后登录
2018-1-17

czd19840303 发表于 2016-6-23 15:27:16 |显示全部楼层 |坛友微信交流群
30论坛币
本人新手,现在使用sas处理沪深300指数的股票遇到了问题。我的目的是求得指数包含的所有股票每年每个月的市值,中位数及其他统计量情况。但麻烦的是沪深300包含的股票每年有好几次变动。

我已经得到了沪深300指数的变动情况,和A股所有股票的所有数据。我的想法是,先提取变动日期作为一个变量,比如叫做date,观测值为20050408,20050704。。。,然后遍历这些日期,取该区间的股票数据形成新的表。例如20050408-20050704这个区间,沪深300包含的股票数的数据做一次描述性统计;再循环至下一个区间:20050704-20060104,重新取新的股票集合的数据再做一次统计;循环下去,直到结束。

我想不通的是,我如何才能调用一个数据集里的变量的观测值作为宏变量去进行循环呢?求助,十分着急,谢谢。

最佳答案

吕小布韦 查看完整内容

不好意思, 刚看到. 要这么写: if date le date%eval(&i+1); 宏变量储存的是字符, 无法直接进行运算, %eval 是指对宏变量进行计算(如果宏变量的值是数字).
关键词:数据集变量 数据集 观测值 沪深300指数 沪深300 SAS 循环
吕小布韦 发表于 2016-6-23 15:27:17 |显示全部楼层 |坛友微信交流群
czd19840303 发表于 2016-6-27 15:32
那请问一下,我循环的时候,如何截取date1—date2这段时间呢?比如我用
%macro run;
%do = 1 to 5;
不好意思, 刚看到. 要这么写:

if date le date%eval(&i+1);

宏变量储存的是字符, 无法直接进行运算, %eval 是指对宏变量进行计算(如果宏变量的值是数字).

使用道具

czd19840303 发表于 2016-6-23 16:22:18 |显示全部楼层 |坛友微信交流群
大神们,快出来搭救我啊

使用道具

吕小布韦 发表于 2016-6-23 20:28:30 |显示全部楼层 |坛友微信交流群
  1. data a;
  2. input a date9.;
  3. call symput('date'||left(trim(_n_)),a);
  4. datalines;
  5. 14may2000
  6. 10jun2002
  7. 3apr2003
  8. 4dec2007
  9. ;
  10. run;

  11. %put _user_;
复制代码


这样不知道是否和你意, a里面是股票变动日期, 生成的宏变量分别是date1-date4

使用道具

zqy458219593 发表于 2016-6-24 11:53:21 |显示全部楼层 |坛友微信交流群
看不到数据结构是什么样的。按照你的意思,我先假定 你的时间区间数据  有START_DATE  END_DATE字段来定义时间间隔
假定数据名分别为time_gap 和stock
  1. proc sql;
  2.         select count(*) into: lock_obs from time_gap;
  3.         select start into: start1-:start%left(&lock_obs.) from time_gap;
  4.         select endd into: endd1-:endd%left(&lock_obs.) from time_gap;
  5. quit;

  6. %macro test;
  7.         %do i=1 %to &obs;

  8.                 data stock&i;
  9.                         set stock;
  10.                         where '&&start&i'd le date le '&&endd&i'd;
  11.                 run;

  12.                 /*            你要做的分析*/
  13.         %end;
  14. %mend;

  15. %test;
复制代码

如果可以,求分

使用道具

czd19840303 发表于 2016-6-27 15:32:31 |显示全部楼层 |坛友微信交流群
吕小布韦 发表于 2016-6-23 20:28
这样不知道是否和你意, a里面是股票变动日期, 生成的宏变量分别是date1-date4
那请问一下,我循环的时候,如何截取date1—date2这段时间呢?比如我用
%macro run;
%do = 1 to 5;
data a;
if date le date&(i+1); --- 这种表达式不行,我希望能找到可以完成它意义的语句
if date gt date%i;
run;
%end;
%mend;
求解,谢谢你

使用道具

楼主好,不知道楼主的问题解决了吗?我最近实习当中也遇到了类似的问题,在SAS中我想要对变量A每一个值与变量B所有值作比较。对A的每一个值Ai,将变脸B中所有小于这个Ai值的求和,我不清楚如何在SAS中实现,想请教一下楼主,谢谢!

使用道具

Tigflanker 发表于 2018-4-11 13:33:35 |显示全部楼层 |坛友微信交流群
苇间风2014 发表于 2018-4-11 11:47
楼主好,不知道楼主的问题解决了吗?我最近实习当中也遇到了类似的问题,在SAS中我想要对变量A每一个值与变 ...
一种方法是用SQL自接然后聚合,另一个方法是用hash循环去做

使用道具

Tigflanker 发表于 2018-4-11 13:33
一种方法是用SQL自接然后聚合,另一个方法是用hash循环去做
好的谢谢楼主,那请问一下您知道如何将表
变量A    变量B
  a1         b1
  a2         b2
  a3         b3
  a4         b4
改成下表吗?
变量A    变量B
  a1         b1
  a2         b1
  a2         b2
  a3         b1
  a3         b2
  a3         b3
  a4         b1
  a4         b2
  a4         b3
  a4         b4
谢谢谢谢谢谢!

使用道具

Tigflanker 发表于 2018-4-12 19:58:36 |显示全部楼层 |坛友微信交流群
苇间风2014 发表于 2018-4-11 17:19
好的谢谢楼主,那请问一下您知道如何将表
变量A    变量B
  a1         b1
  1. data have;
  2.   input a $ b;
  3. cards;
  4. Tom 123
  5. Jerry 234
  6. LiLei 345
  7. ;run;

  8. data have;
  9.   set have;

  10.   id = _N_;
  11. run;

  12. proc sql;
  13.   create table want as
  14.   select a.a as a, b.b as b
  15.   from have a full join have b
  16.   on a.id >= b.id
  17.   ;
  18. quit;
复制代码
你不介意效率的话,可以这样做
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
苇间风2014 + 1 + 1 + 1 热心帮助其他会员

总评分: 学术水平 + 1  热心指数 + 1  信用等级 + 1   查看全部评分

使用道具

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

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

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

GMT+8, 2024-4-17 02:21