楼主: Tigflanker
1493 8

[问答] 问一个很小的问题 [推广有奖]

  • 8关注
  • 18粉丝

副教授

49%

还不是VIP/贵宾

-

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

楼主
Tigflanker 发表于 2012-10-16 15:05:15 来自手机 |AI写论文
30论坛币
(手机发帖,格式乱,请见谅)

向各位老师请教一个小问题,例如有abc01ef这样的变量二十个(直到abc20ef)

现在我想在data步中描述这么一个问题:如果全部变量都为空,则为真。我想请老师用数组和宏变量的方式分别做一下,感激不尽。

附,和这个相似的问题我解决了:如果全部变量均非空,则为真,我的实现是这样的:

data a;
set a;
if missing(abc01ef + ... + abc20ef) then ;else 判断实现;
run;

谢谢。

最佳答案

davil2000 查看完整内容

data ; retain s 1; d1=.; d2=.; d3=.; d4=.; d5=.; array var{5} d1-d5; do i=1 to 5; s=s * (var{i}=' '); end; put s=; /*if s=1 then do; */ /*...statement...*/ /*end;*/ run;
关键词:missing data步 Data Miss SSIN 手机

沙发
davil2000 发表于 2012-10-16 15:05:16
data ;
retain s 1;
d1=.;
d2=.;
d3=.;
d4=.;
d5=.;
array var{5} d1-d5;
      do i=1 to 5;
         s=s * (var{i}=' ');
      end;
put s=;
/*if s=1 then do;  */
/*...statement...*/
/*end;*/
run;
已有 5 人评分经验 论坛币 学术水平 热心指数 信用等级 收起 理由
瀚海星云 + 1 + 1 + 1 精彩帖子
南海游客 + 5 + 5 + 5 精彩帖子
大数据之魂 + 100 + 5 + 5 + 5 对论坛有贡献
Tigflanker + 1 + 1 + 1 感谢,很对味,很简单,也很快。
数据分析师3K + 80 + 1 + 1 + 1 热心帮助其他会员

总评分: 经验 + 100  论坛币 + 80  学术水平 + 13  热心指数 + 13  信用等级 + 13   查看全部评分

R是万能的,SAS是不可战胜的!

藤椅
ziyenano 发表于 2012-10-16 15:54:22
data ex;
input abc01ef abc02ef abc03ef  ;
cards;
1 2 3
1 . 3
. . .
;
run;

/*数组运算*/
data ex1(drop=i j);
set ex;
count=0;
array  aa(*) abc01ef abc02ef abc03ef;
do i=1 to dim(aa);
if missing(aa(i)) then j=0;
else j=1 ;
count+j;
end;
if count=0 then put "true";
else put "false";
run;

/*用宏做个循环没多大意思,用n函数更方便直接*/
data ex1;
set ex;
if n(abc01ef,abc02ef,abc03ef)=0 then put "true";
else put "false";
run;
已有 2 人评分论坛币 学术水平 热心指数 信用等级 收起 理由
Tigflanker + 1 + 1 + 1 很厉害,感谢,不过只能加这多了。
数据分析师3K + 80 + 1 + 1 + 1 热心帮助其他会员

总评分: 论坛币 + 80  学术水平 + 2  热心指数 + 2  信用等级 + 2   查看全部评分

板凳
Imasasor 发表于 2012-10-16 15:58:52
  1. /*最简单方法*/
  2. data b;
  3. set a;
  4. if n(x,y,z)=0 then hello="全为空";
  5. run;

  6. /*如果你非要用数组*/
  7. data c;
  8. set a;
  9. array fuk(3) x--z;
  10. point=0;
  11. do i=1 to 3;
  12. if missing(fuk(i))=0 then point+1;
  13. end;
  14. if point=0 then hello="全为空";
  15. drop i point;
  16. run;

  17. /*至于宏,宏仅仅是文本替代,上述两个方法都可以改写成宏,只不过将简单的变麻烦了,不做赘述了*/
复制代码
不求别的,只为论坛币
已有 2 人评分经验 论坛币 学术水平 热心指数 信用等级 收起 理由
Tigflanker + 1 + 1 + 1 感谢感谢,加的很少,以后加给。
数据分析师3K + 100 + 100 + 1 + 1 + 1 鼓励积极发帖讨论

总评分: 经验 + 100  论坛币 + 100  学术水平 + 2  热心指数 + 2  信用等级 + 2   查看全部评分

欢迎加入亚太地区第一R&Python数据挖掘群: 251548215;

报纸
Imasasor 发表于 2012-10-16 16:01:21
ziyenano 发表于 2012-10-16 15:54
data ex;
input abc01ef abc02ef abc03ef  ;
cards;
我靠,你跟我师从的同一个祖师吧?
欢迎加入亚太地区第一R&Python数据挖掘群: 251548215;

地板
ziyenano 发表于 2012-10-16 16:07:35
Imasasor 发表于 2012-10-16 16:01
我靠,你跟我师从的同一个祖师吧?
这种问题,着实想不出什么出彩的思路

7
数据分析师3K 发表于 2012-10-16 16:22:29
Imasasor 发表于 2012-10-16 15:58
不求别的,只为论坛币
如你所愿了吧 O(∩_∩)O~

8
Imasasor 发表于 2012-10-16 16:23:21
数据分析师3K 发表于 2012-10-16 16:22
如你所愿了吧 O(∩_∩)O~
谢谢啊!!!!
欢迎加入亚太地区第一R&Python数据挖掘群: 251548215;

9
bobguy 发表于 2012-10-17 06:37:47
Using the sum function can bypass an looping of array index. It is not only simpler, but also it runs faster as well. See the comparison at bottom.

There is no macro necessary in this context.

data t1;
  array abc[*] abc01ef abc02ef abc03ef abc04ef;
  do i=1 to 5;
      
     do j=1 to dim(abc);
             if i in (1,4,5) then abc[j]=ranuni(123);
                 else abc[j]=.;
         end;
         output;
  end;
  keep abc:;
run;

data t2;
  set t1;
  array abc[*] abc01ef abc02ef abc03ef abc04ef;
  missflag=(sum(of abc[*])=.);
run;

proc print;run;

******************************
251  data t1;
252    array abc[*] abc01ef abc02ef abc03ef abc04ef;
253    do k=1 to 1e6;
254    do i=1 to 5;
255
256       do j=1 to dim(abc);
257           if i in (1,4,5) then abc[j]=ranuni(123);
258           else abc[j]=.;
259       end;
260       output;
261    end;
262    end;
263    keep abc:;
264  run;

NOTE: The data set WORK.T1 has 5000000 observations and 4 variables.
NOTE: DATA statement used (Total process time):
      real time           1.64 seconds
      cpu time            1.57 seconds


265
266  data t2;
267    set t1;
268    array abc[*] abc01ef abc02ef abc03ef abc04ef;
269    missflag=(sum(of abc[*])=.);
270  run;

NOTE: Missing values were generated as a result of performing an operation on missing values.
      Each place is given by: (Number of times) at (Line):(Column).
      2000000 at 269:13
NOTE: There were 5000000 observations read from the data set WORK.T1.
NOTE: The data set WORK.T2 has 5000000 observations and 5 variables.
NOTE: DATA statement used (Total process time):
      real time           1.57 seconds
      cpu time            1.35 seconds


271
272  data t2;
273
274    set t1;
275    array abc[*] abc01ef abc02ef abc03ef abc04ef;
276    s=1;
277    do i=1 to dim(abc);
278       s=s*missing(abc[i]);
279    end;
280    drop i;
281  run;

NOTE: There were 5000000 observations read from the data set WORK.T1.
NOTE: The data set WORK.T2 has 5000000 observations and 5 variables.
NOTE: DATA statement used (Total process time):
      real time           3.89 seconds
      cpu time            1.81 seconds
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
Tigflanker + 1 + 1 + 1 thank U, thanks, Nice solution..

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

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

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2026-1-1 19:13