SAS中文论坛

 找回密码
 立即注册

扫一扫,访问微社区

查看: 2881|回复: 19
打印 上一主题 下一主题

以下的程序怎么编程

[复制链接]

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
楼主
 楼主| 发表于 2009-5-10 15:09:58 | 只看该作者

以下的程序怎么编程

以下的问题如何通过编程获得
一列数据的前k项均值和后n-k项均值的差值
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
沙发
 楼主| 发表于 2009-5-10 17:11:43 | 只看该作者

Re: 以下的程序怎么编程

程序比较丑~~~不过能解决问题。。
[code]
proc sql noprint;
select mean(x) into :pre
from youdata(firstobs=1 obs=k)
;
select mean(x) into :post
from youdata(firstobs=k obs=n-k)
;
%put The difference = %sysevalf(&pre-&post);
quit;
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
板凳
 楼主| 发表于 2009-5-12 21:35:19 | 只看该作者

Re: 以下的程序怎么编程

*create a dataset;
data tblTrial;
do i=1 to 20;
    x=i;
    if ^mod(x,5) then x=.;
    output;
end;
drop i;
run;
proc print;run;

*get means and differences;
data tblTrial_1;
set tblTrial end=endof;
k=10;*assume k=10;
retain Ntot NnmissK NnmissK_N nSumK nSumK_N 0;
Ntot+1;
if ^missing(x) then do;*excluding missing values;
    if Ntot<=k then do;
       NnmissK+1;
       nSumK=sum(x,nSumK);
    end;
    else do;*after k;
           NnmissK_N+1;
           nSumK_N=sum(x,nSumK_N);
   end;
end;
if endof then do;
    if NnmissK then nMeanK=nSumK/NnmissK;
       else do;
              nSumK=.;
              nMeanK=.;
       end;
    if NnmissK_N then nMeanK_N=nSumK_N/NnmissK_N;
       else do;
              nSumK_N=.;
              nMeanK_N=.;
       end;
      nDiff=nMeanK-nMeanK_N;
      output;
end;
drop x;
run;

proc print;run;
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
地板
 楼主| 发表于 2009-5-12 22:21:52 | 只看该作者

Re: 以下的程序怎么编程

[code:30d0mgl4]data ahuige;
  input A B;
  cards;
2 3
2 3
5 7
7 9
;run;
%let k=2;
%macro cal(VAL); sum((monotonic()<=&k)*&val)/sum(monotonic()<=&k)-sum((monotonic()>&k)*&val)/sum(monotonic()>&k)%mend;

proc sql;
  select distinct  %CAL(A) as AA,%CAL(B) as BB
  from ahuige;
  ;[/code:30d0mgl4]
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
5#
 楼主| 发表于 2009-5-12 22:46:58 | 只看该作者

Re: 以下的程序怎么编程

*very good, but not work for this dataset;
data ahuige;
  input A B;
  cards;
. 1
2 3
5 7
7 9
;run;
%let k=2;
%macro cal(VAL); sum((monotonic()<=&k)*&val)/sum(monotonic()<=&k)-sum((monotonic()>&k)*&val)/sum(monotonic()>&k)%mend;

proc sql;
  select distinct  %CAL(A) as AA,%CAL(B) as BB
  from ahuige;
  ;
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
6#
 楼主| 发表于 2009-5-12 23:21:21 | 只看该作者

Re: 以下的程序怎么编程

[code:1wvui6py]%macro cal(VAL); sum((monotonic()<=&k)*&val)/sum((monotonic()<=&k)*(1-missing(&val)))
                -sum((monotonic()> &k)*&val)/sum((monotonic()> &k)*(1-missing(&val)))%mend;

proc sql;
  select distinct %CAL(A) as AA,%CAL(B) as BB
  from ahuige
  ;[/code:1wvui6py]
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
7#
 楼主| 发表于 2009-5-13 02:37:04 | 只看该作者

Re: 以下的程序怎么编程

呵呵呵,,我怎么就没想到rownum函数~~..
<!-- s:lol: --><img src="{SMILIES_PATH}/icon_lol.gif" alt=":lol:" title="Laughing" /><!-- s:lol: --> 幸好没用fetchobs,否则丢脸到家~~~
Proc SQL不支持Oracle的group rownum功能~~~
经常郁闷~~
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

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

Re: 以下的程序怎么编程

因为自己不是计算机专业的,所以尽量避免用sql,以免滥竽充数。但从以上的程序看来,sql是有独到之处,尤其是0/0居然没有错误提示。而且那个monotonic()居然从手册都查不到。 厉害。
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
9#
 楼主| 发表于 2009-5-13 16:56:53 | 只看该作者

Re: 以下的程序怎么编程

如果你对DATA步那么坚持的话。

[code:3acqjf7j]data ahuige;
  input A B;
cards;
2 3
2 3
5 7
7 9
;
run;

%let k=2;
data ex(keep=ma mb);
   set ahuige nobs=n;
  if &amp;k&#46; ge _N_ then
      do;
          aa1+A;bb1+B;
        end;
      else do;
           aa2+A;bb2+B;
                 end;

  if _N_=n then
        do;
           ma=aa1/&amp;k&#46;- aa2/(n-&amp;k&#46;);
                   mb=bb1/&amp;k&#46;- bb2/(n-&amp;k&#46;);
           output;
                  end;
   run;[/code:3acqjf7j]
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

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

Re: 以下的程序怎么编程

感觉还是ahuige的代码简洁明了。那个monotonic函数让我汗颜,居然在sas help里面找不到,请问哪里有类似这种神奇的函数?能共享这方面的资料吗?ahuige?
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-2-5 21:19 , Processed in 0.088345 second(s), 20 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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