楼主: Tigflanker
3752 6

[问答] 关于宏内%do循环的一个小问题 [推广有奖]

  • 8关注
  • 18粉丝

副教授

49%

还不是VIP/贵宾

-

威望
0
论坛币
2321 个
通用积分
9.9128
学术水平
179 点
热心指数
194 点
信用等级
167 点
经验
27443 点
帖子
622
精华
0
在线时间
851 小时
注册时间
2011-3-27
最后登录
2023-5-14

楼主
Tigflanker 发表于 2012-10-23 00:21:51 |AI写论文
50论坛币
拜托老师帮我想一个问题,无论有空帮助否,非常感谢。

问题描述:我需要wocf(worst observation carried forward)的程序段。

首先我给大家描述下WOCF的意思是:一行观测,假如有20个变量,不妨假设从v1-v20分别为:1,2,3,...14,15,(缺失),(缺失),(缺失),(缺失),(缺失)。假如15是最好的,1是最差的。那么wocf的意思就是用最差的1来填补后面的5个观测。

实现问题:

前提假设:有个数据集out.all,内有观测v1-v20,20个变量,后5个缺失。

本来打算用数组进行,结果出了问题:(本问题已解决,max内不能用数组)

  1. data out.wocf;
  2. set out.try;
  3. drop i;
  4. array va(20) v1-v20;
  5. do i=1 to 20;
  6.   if missing(va(i)) then va(i)=max(of va(1)-va(i-1));*问题:数组在max函数中报错;
  7. /*  if missing(va(i)) then va(i)=min(of va(1) - va(i-1));*/
  8. %end;
  9. run;
复制代码


然后企图在外面加个macro壳,结果继续碰了个钉子:
  1. %macro wocf;
  2. data out.wocf;
  3. set out.try;
  4. drop i;
  5. %do i=1 %to 20;
  6.   if missing(v&i.) then v&i.=max(of v1-v&i-1.);*%do循环里的自变量i,本次是&i.,前一个该怎么表示呢?;
  7. /*  if missing(va(i)) then va(i)=min(of va(1) - va(i-1));*/
  8. %end;
  9. run;
  10. %mend;

  11. %wocf;
复制代码


拜托老师对两种方法分别予以指明,谢谢;本人方法控,不太以解决问题为目的。

最佳答案

pobel 查看完整内容

data out.wocf; set out.try; drop i; array va(20) v1-v20; do i=1 to 20; if i=1 then worst=va(i); else worst=max(va(i),worst); if missing(va(i)) then va(i)=worst; end; run;
关键词:do循环 小问题 observation observat missing carried forward 程序 最好

沙发
pobel 在职认证  发表于 2012-10-23 00:21:52
data out.wocf;

set out.try;

drop i;
array va(20) v1-v20;

do i=1 to 20;
  if i=1 then worst=va(i);
  else worst=max(va(i),worst);

  if missing(va(i)) then va(i)=worst;
end;

run;
和谐拯救危机

藤椅
xuxin3000 发表于 2012-10-23 00:38:05
How about this~

data wocf;
set try;
drop i;
array va(20) v1-v20;
do i=1 to 20;
  if missing(va(i)) then va(i)=max(of v1-v20);
end;
run;
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
Tigflanker + 1 + 1 + 1 谢谢。

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

板凳
Tigflanker 发表于 2012-10-23 08:22:59 来自手机
xuxin3000 发表于 2012-10-23 00:38
How about this~

data wocf;
感谢。这的确是直接把问题解决了,不过我想问的两个问题我还是搞不明白:1。max函数中是否不能用数组变量?还是我用错了?2。%do循环中的临时变量i的本次循环调用是&i.,那想调用上次循环的i,怎么用呢?

感谢解答。
Bye SAS.
若有缘,能重聚。

报纸
Tigflanker 发表于 2012-10-23 09:08:23 来自手机
pobel 发表于 2012-10-23 08:36
data out.wocf;

set out.try;
谢谢pobel老师,这个做法可移植,采纳;

另外请问用宏套用的那个办法可行吗?就那一点过不去挺可惜的。
Bye SAS.
若有缘,能重聚。

地板
bobguy 发表于 2012-10-23 11:41:04
There is no macro needed. Here is a simple way.

data t1;
  retain v1-v10 (2 3 -1 1 . 5 . 8 . 9);
  array v[*] v1-v10;
  *first get min value;
  min=min (of v[*]);
  do i=1 to dim (v);
     *patched value with min if it is missing;
     v[i]=coalesce(v[i],min);
  end;
run;

proc print;run;
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
Tigflanker + 1 + 1 + 1 非常感谢!我只能采纳前面答应的,不好意思.

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

7
ls5655 发表于 2012-10-30 17:31:44
data output;
set input;
array temp v1-v20;
do over temp;
if temp=. then temp=99999;
end;
array new v1-v20;
do i=1 to 20;
if new[i]=99999 then new[i]=min(of new[*]);
end;
run;

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

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-27 06:19