SAS中文论坛

 找回密码
 立即注册

扫一扫,访问微社区

查看: 1407|回复: 7
打印 上一主题 下一主题

Macro求救

[复制链接]

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
楼主
 楼主| 发表于 2009-8-10 13:41:28 | 只看该作者

Macro求救

我有个dataset,大致如下:
name    time            trade
AAA     9:00:00          xx
AAA     13:00:00         xx
AAA     15:20:30        xx
BBB     8:20:30         xx
BBB     12:30:00        xx
...     ...             ...

要求用macro计算各个公司上下午的trade frequency,以及上下午的trade frequency
different。

我把公司的名字已经从上面提取出来放在firms这个file里面了,上面的dataset我也标
记了timeflag,上午0,下午1;
下面是我的程序:
data allfirm;
        set test3;
        if time<"12:00:00" then timeflag=0;
    if time>="12:00:00" then timeflag=1;
run;

%let firms=&firms; (这里显示:WARNING: Apparent symbolic reference FIRMS
not resolved.
ERROR: The text expression &FIRMS contains a recursive reference to the
macro variable FIRMS.  The macro variable will be assigned the null value.)

%global dsnames;

%macro dowork (whichfirm);
        proc means whatever data=allfirm(where=(firm="&whichfirm"));
               by timeflag;
                           var trade;
                           output out=tradefreq_&whichfirm(drop=_type_ _freq_) N=/trade_N;
                end;
%mend dowork;
%repeatwork;

这里显示:WARNING: Apparent invocation of macro REPEATWORK not resolved.

ERROR 180-322: Statement is not valid or it is used out of proper order.

ERROR: Invalid macro name ;.  It should be a valid SAS identifier no longer
than 32 characters.
ERROR: A dummy macro will be compiled.

另外,怎么求different of trade frequency between morning and afternoon?

%macro ;
   %let j=1;repeatwork
   %do %while (%scan(&firms,&j) ne );
       %let inputds=%scan(&firms,&j);           %dowork (&inputds);
                %let j=%eval(&j+1);
%end;
%mend repeatwork;

谢谢!!!
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
沙发
 楼主| 发表于 2009-8-10 15:43:44 | 只看该作者

Re: Macro求救

不太明白,能用数据解释一下trade frequency 和trade frequency different是怎么算吗?
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
板凳
 楼主| 发表于 2009-8-10 17:38:14 | 只看该作者

Re: Macro求救

trade frequency就是trade发生的次数,也就是valid observation的个数,因为有的时间点trade那里没有数。difference就是上下午这个个数的差。

比如
name time trade timeflag
AAA 9:00:00 xx    0
AAA 13:00:00 xx  1
AAA 15:20:30 xx  1
BBB 8:20:30 xx     0
BBB 12:30:00 xx   1

那么对于AAA
                timeflag tradefreq tradedifferent
morning           0           1                .
afternoon         1           2               1

BBB.......
......
以此类推,报告所有公司的情况

不知道我说清楚了么?
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
地板
 楼主| 发表于 2009-8-10 17:51:12 | 只看该作者

Re: Macro求救

另外还有个问题,这里我想把上下午标识出来,原来test1里面 time format为time8.
这一句:
163  data allfirm;
164      set test1;
165      if time<"12:00:00" then timeflag=0;
166      if time>="12:00:00" then timeflag=1;
167  run;

NOTE: Character values have been converted to numeric values at the places given by:
      (Line):(Column).
      165:16   166:17
NOTE: Invalid numeric data, '12:00:00' , at line 165 column 16.
NOTE: Invalid numeric data, '12:00:00' , at line 166 column 17.

这该怎么办?
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
5#
 楼主| 发表于 2009-8-10 19:12:52 | 只看该作者

Re: Macro求救

[code:jyjw08pi]data original;
        input name $ time time8. trade;
        if time<'12:00:00't then timeflag=0;
        else timeflag=1;
        format time time8.;
datalines;
AAA 9:00:00 10
AAA 13:00:00 20
AAA 15:20:30 30
BBB 8:20:30 40
BBB 9:30:00 50
BBB 12:30:00 60
;

%macro convert(in_ds,out_ds);
        options nosymbolgen nomprint;
        proc sort data=&in_ds out=&out_ds;
                by name timeflag;
        run;

        data &out_ds;
                do trade_freq=1 by 1 until(last.timeflag);
                        set &out_ds;
                        by name timeflag;
                end;
        run;

        data &out_ds(drop=temp);
                set &out_ds;
                by name;
                temp=lag(trade_freq);
                if last.name=1 then trade_dif=temp-trade_freq;
        run;
%mend;

%convert(original,final)[/code:jyjw08pi]
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
6#
 楼主| 发表于 2009-8-10 21:14:37 | 只看该作者

Re: Macro求救

Yeah!!!

Thank you very much!!!
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
7#
 楼主| 发表于 2009-8-10 22:06:50 | 只看该作者

Re: Macro求救

原数据库里有的trade data missing,如果用trade_freq=1 by 1,这个语句是不是不管有没有数都会count?

不过我对那个dataset处理了一下,去掉了missing data。

不知道有没有别的方法处理?
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
8#
 楼主| 发表于 2009-8-10 22:46:07 | 只看该作者

Re: Macro求救

trade eq . 时不参加计算是吗? 改过了。
[code:3h0bjcog]data original;
   input name $ time time8. trade;
   if time<'12:00:00't then timeflag=0;
   else timeflag=1;
   format time time8.;
datalines;
AAA 9:00:00 10
AAA 13:00:00 .
AAA 15:20:30 30
BBB 8:20:30 .
BBB 9:30:00 50
BBB 12:30:00 60
;

%macro convert(in_ds,out_ds);
   options nosymbolgen nomprint;
   proc sort data=&in_ds out=&out_ds;
      by name timeflag;
   run;

   data &out_ds(drop=_i trade time);
      trade_freq=0;
      do _i=1 by 1 until(last.timeflag);
         set &out_ds;
         by name timeflag;
         if trade ne . then trade_freq+1;
      end;
   run;

   data &out_ds(drop=temp);
      set &out_ds;
      by name;
      temp=lag(trade_freq);
      if last.name=1 then trade_dif=temp-trade_freq;
   run;       
%mend;

%convert(original,final)[/code:3h0bjcog]
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|小黑屋|手机版|Archiver|SAS中文论坛  

GMT+8, 2026-2-5 23:10 , Processed in 0.173965 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表