SAS-如果然后条件语句

时间:2018-08-30 17:16:30

标签: sas sas-macro

我的数据超过70,000。我有50多个变量。 (Var1至Var50)。在每个变量中,大约有30个组(我将使用a到z)。我正在尝试使用if语句选择数据。我想选择同一组的每个数据。例如,在var 1至30中使用a表示数据,在var 1至30中使用b表示数据。 我好像在写 如果(Var1 =“ a”和Var2 =“ a”以及Var3 =“ a”和Var4 =“ a”并一直到var50 = “ a”)或(Var1 =“ b”和Var2 =“ a”以及Var3 =“ b”和Var4 =“ b”,一直到var50 = “ b”)... 我如何合并?我尝试使用数组,但是没有用,我不确定数组是否可以在IF中使用,然后再声明。

    IF (VAR2="A" or VAR2="B" or VAR2="C" or VAR2="D" 
    or VAR3="A" or VAR3="B" or VAR3="C" or VAR3="D"
 or VAR4="A" or VAR4="B" or VAR4="C" or VAR4="D" 
 or VAR5="A" or VAR5="B" or VAR5="C" or VAR5="D"
 or VAR6="A" or VAR6="B" or VAR6="C" or VAR6="D"
 or VAR7="A" or VAR7="B" or VAR7="C" or VAR7="D" 
 or VAR8="A" or VAR8="B" or VAR8="C" or VAR8="C" 
 or VAR9="A" or VAR9="B" or VAR9="C" or VAR9="D" 
 or VAR10="A" or VAR10="B" or I10_D10="C" or VAR10="D"

 or VAR12="A" or VAR12="B" or VAR12="C" or VAR12="D" 
 or VAR13="A" or VAR13="B" or VAR13="C" or VAR13="D"
 or VAR14="A" or VAR14="B" or VAR14="C" or VAR14="D" 
 or VAR15="A" or VAR15="B" or VAR15="C" or VAR15="D"
 or VAR6="A" or VAR16="B" or VAR16="C" or VAR16="D"
 or VAR17="A" or VAR17="B" or VAR17="C" or VAR17="D" 
 or VAR18="A" or VAR18="B" or VAR18="C" or VAR18="C" 
 or VAR19="A" or VAR19="B" or VAR19="C" or I10_D19="D" 
 or VAR20="A" or VAR20="B" or I10_D20="C" or VAR20="D" 
or VAR21="D" or VAR22="A" or VAR22="B" or VAR22="C" or VAR22="D" 
 or VAR23="A" or VAR23="B" or VAR23="C" or VAR23="D"
 or VAR24="A" or VAR24="B" or VAR24="C" or VAR24="D" 
 or VAR25="A" or VAR25="B" or VAR25="C" or VAR25="D"
 or VAR26="A" or VAR26="B" or VAR26="C" or VAR26="D"
 or VAR27="A" or VAR27="B" or VAR27="C" or VAR27="D" 
 or VAR28="A" or VAR28="B" or VAR28="C" or VAR28="C" 
 or VAR29="A" or VAR29="B" or VAR29="C" or VAR29="D" 
 or VAR30="A" or VAR30="B" or I10_D30="C" or VAR30="D") 
 then Group=1; else Group=0;

4 个答案:

答案 0 :(得分:0)

您可能不需要宏,但是宏可能会更快。

%let value=a;

data want;
set have;
array var[50];
keepit=1;
do i=1 to 50;
   keepit = keepit and (var[i]="&value");
   if ^keepit then
      leave;
end;
if keepit;
drop i keepit;
run;

我创建了一个信号变量并更新了它的值,如果var[]数组中的任何值不是&value,它将为false。如果发现1个不匹配的值,我会提早退出循环,以提高效率。

答案 1 :(得分:0)

不清楚您想要什么。如果要避免检查所有变量,可以使用WHICHC查找列表中是否有A。

X = whichc('a', of var1-var30);

如果您想查看所有变量中有哪些不同的组,我想您需要一个很大的触发频率:

 proc freq data=have noprint;
   table var1*var2*var3*var4....*var30*gender*age / list out=table_counts;
 run;

然后检查table_counts数据集以查看是否具有所需的内容。

如果这些都不是您想要的,则需要在问题中添加更多详细信息。数据样本和预期的输出将是完美的。

答案 2 :(得分:0)

当我需要为一个特定的值搜索几个变量时,我将要做的是-将所有变量合并为一个字符串,然后搜索该字符串。像这样:

*** CREATE TEST DATA ***;
data have;
    infile cards;
    input VAR1 $ VAR2 $ VAR3 $ VAR4 $ VAR5 $;
    cards;
J J K A M
S U I O P
D D D D D
l m n o a
Q U J C S
;
run;

data want;
    set have;

    *** USE CATS FUNCTION TO CONCATENATE ALL VAR# INTO ONE VARIABLE ***; 
    allvar = cats(var1, var2, var3, var4, var5); 

    *** IF NEEDED, APPLY UPCASE TO CONCATENATED VARIABLE ***;
    *allvar = upcase(allvar);

    *** USE INDEXC FUNCTION TO SEARCH NEW VARIABLE ***;
    if indexc(allvar, "ABCD") > 0 then group = 1;
    else group = 0;
run;

我不确定这是否正是您所需要的,但希望可以为您的特定任务进行修改。

答案 3 :(得分:0)

发布的代码正在测试变量列表中的任何一个是否与值列表中的任何一个匹配。

让我们建立一个简单的测试数据集。

data have ;
  input id (var1-var5) ($);
cards;
1 E F G H I
2 A B C D E
;;;;

制作一个要查找的值数组和一个要检查的变量数组。遍历变量列表,直到找到包含值之一的变量,或者用尽了要测试的变量。

data want ;
  set have;
  array values (4) $8 _temporary_ ('A' 'B' 'C' 'D');
  array vars var1-var5 ;
  group=0;
  do i=1 to dim(vars) until (group=1);
    if vars(i) in values then group=1;
  end;
  drop i;
run;

如果需要,可以避免使用数组作为值列表。

  if vars(i) in ('A' 'B' 'C' 'D') then group=1;

但是使用数组可以使循环在值列表而不是变量列表上运行。

  do i=1 to dim(values) until (group=1);
    if values(i) in vars then group=1;
  end;

如果您想保留变量i来指示哪个值(或变量)最先匹配,那么这可能很重要。