SAS - если и тогда условия заявления - PullRequest
0 голосов
/ 30 августа 2018

Мои данные более 70000. У меня есть более 50 переменных. (Вар1 до вар50). В каждой переменной около 30 групп (я буду использовать от a до z). Я пытаюсь получить выборку данных, используя операторы if. Я хотел бы выбрать все данные с той же группой. Например, данные от 1 до 30 с a, данные с 1 до 30 в b. Кажется, я пишу Если (Var1 = "a" и Var2 = "a" и Var3 = "a" и Var4 = "a" и все пути к var50 = "a") или (Var1 = "b" и Var2 = "a", Var3 = "b" и Var4 = "b", и вплоть до var50 = "Б") ... Как мне объединить? Я пытался использовать массив, но он не работал, и я не был уверен, работают ли массивы в операторе 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 голосов
/ 05 сентября 2018

Отправленный код проверяет, совпадает ли ЛЮБОЙ из списка переменных ЛЮБОЙ из списка значений.

Давайте сделаем простой набор тестовых данных.

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, чтобы указать, какое значение (или переменная) было впервые найдено.

0 голосов
/ 31 августа 2018

Не совсем понятно, чего вы хотите. Если вы хотите избежать проверки всех переменных, вы можете использовать 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, чтобы увидеть, есть ли у вас то, что вы хотите.

Если ни один из них не является тем, что вам нужно, вам нужно добавить больше деталей к вашему вопросу. Образец данных и ожидаемый результат будут идеальными.

0 голосов
/ 05 сентября 2018

Когда мне нужно найти несколько переменных для определенного значения, я сделаю следующее: объединю все переменные в одну строку и затем выполняю поиск в этой строке. Как это:

*** 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;

Я не уверен, что это именно то, что вам нужно, но, надеюсь, это то, что вы можете изменить для вашей конкретной задачи.

0 голосов
/ 30 августа 2018

Вам, вероятно, не нужен макрос, однако макрос может быть быстрее.

%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. Я оставляю цикл раньше, если мы найдем 1 несоответствующее значение, чтобы сделать его более эффективным.

...