楼主: jackbt123
6155 9

[问答] [SAS Data Management]如何判断多个变量的值是否等于一个常量 [推广有奖]

  • 0关注
  • 0粉丝

硕士生

59%

还不是VIP/贵宾

-

威望
0
论坛币
110 个
通用积分
0.3000
学术水平
2 点
热心指数
4 点
信用等级
2 点
经验
847 点
帖子
56
精华
0
在线时间
263 小时
注册时间
2008-11-28
最后登录
2017-9-21

楼主
jackbt123 发表于 2011-7-5 09:38:29 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
如何判断多个变量的值是否等于一个常量
IF(A1 = 1 OR A2 = 1 OR A3 = 1 OR ...... OR A100 = 1)
THEN DUMMAY = 1;
ELSE DUMMAY = 0;

More efficient way
Array, Do Loop and Until or While

ARRAY ARRAY_TEMP {*} A1 - A100;
DUMMAY = 0;
DO i = 1 TO 100 WHILE (DUMMAY = 0);
IF ARRAY_TEMP {i} = 1 THEN DUMMAY = 1;
END;

Question: other solutions?
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:Management Managemen Manage 多个变量 Data 变量 SAS Management Data 常量

本帖被以下文库推荐

沙发
honghejing 发表于 2011-7-5 10:50:17
使用sql的count(distinct variable)看看是否大于一

藤椅
jackbt123 发表于 2011-7-5 11:12:54
2# honghejing

谢谢你的提示。能否具体点。谢谢。

板凳
pobel 在职认证  发表于 2011-7-5 11:24:39
data test;
    array a {10} a1-a10;
do i=1 to dim(a);
    a(i)=1;
end;
output;
a3=111;
    output;
a4=2;
output;
drop i;
run;
data wanted;
    set test;
all="*"||catx("*",of a1-a10);
if missing(tranwrd(all,"*1",""));
run;
已有 1 人评分经验 热心指数 收起 理由
crackman + 80 + 3 鼓励积极发帖讨论

总评分: 经验 + 80  热心指数 + 3   查看全部评分

和谐拯救危机

报纸
jackbt123 发表于 2011-7-5 11:58:02
4# pobel

谢谢你的回复。
不过好像你有点偏离我的问题了。
在IFcondition 里,我用了 OR 不是 AND。

地板
pobel 在职认证  发表于 2011-7-5 12:16:10
data wanted;
    set test;
all="*"||catx("*",of a1-a10)||"*";
if index(all,"*1*");
run;
和谐拯救危机

7
soporaeternus 发表于 2011-7-5 13:02:50
if else嵌套吧,满足了就跳出来,尽量别做所有的判断
Let them be hard, but never unjust

8
jackbt123 发表于 2011-7-5 18:20:25
7# soporaeternus

谢谢你的意见。
如果我们有1000个变量或者更多的话,用 IF ELSE 会不会很麻烦。
我们知道可以用 IN OPERATOR 去判断一个变量是否等于多个不同的值。
如果也有函数可以运用在这里就好了。

9
bobguy 发表于 2011-7-6 10:19:48
jackbt123 发表于 2011-7-5 09:38
如何判断多个变量的值是否等于一个常量
IF(A1 = 1 OR A2 = 1 OR A3 = 1 OR ...... OR A100 = 1)
THEN DUMMAY = 1;
ELSE DUMMAY = 0;

More efficient way
Array, Do Loop and Until or While

ARRAY ARRAY_TEMP {*} A1 - A100;
DUMMAY = 0;
DO i = 1 TO 100 WHILE (DUMMAY = 0);
IF ARRAY_TEMP {i} = 1 THEN DUMMAY = 1;
END;

Question: other solutions?
More efficient way turns out much slower than a seemingly dumb approach(3 times faster). It is faster in coding not in executing. See the log below.

753  data t1;
754  array A(100);
755    do i=1 to 1e6;
756      do j=1 to dim(A);
757        A[j]=ceil(ranuni(123)*1000);
758      end;
759      output;
760    end;
761    keep A:;
762  run;
NOTE: The data set WORK.T1 has 1000000 observations and 100 variables.
NOTE: DATA statement used (Total process time):
      real time           13.22 seconds
      cpu time            9.90 seconds

763
764  %macro ifcondition(k);
765    %do i=1 %to &k;
766      %if &i=1 %then A&i=1;
767      %else OR A&i=1;
768    %end;
769  %mend;
770
771
772  data _null_;
773    set t1;
774    if %ifcondition(100)
775    THEN DUMMAY = 1;
776    ELSE DUMMAY = 0;
777  run;
NOTE: There were 1000000 observations read from the data set WORK.T1.
NOTE: DATA statement used (Total process time):
      real time           0.99 seconds
      cpu time            0.63 seconds

778
779
780  data _null_;
781    set t1;
782    ARRAY ARRAY_TEMP {*} A1 - A100;
783    DUMMAY = 0;
784    DO i = 1 TO 100 WHILE (DUMMAY = 0);
785    IF ARRAY_TEMP {i} = 1 THEN DUMMAY = 1;
786    END;
787  run;
NOTE: There were 1000000 observations read from the data set WORK.T1.
NOTE: DATA statement used (Total process time):
      real time           2.23 seconds
      cpu time            1.74 seconds

10
jackbt123 发表于 2011-7-6 18:16:36
9# bobguy


Thank you so much.

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

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