Оператор SAS where

#sas

#sas

Вопрос:

Новичок в SAS — пытаюсь выполнить практическое упражнение. Вероятно, я сам столкнусь с palm, как только кто-нибудь укажет, что я делаю неправильно, но пока я не могу сказать, в чем проблема.

У меня есть набор данных с 3 переменными: ID $ avgNumDonations DonationAmt.

введите описание изображения здесь

Меня просят создать подмножество (я делаю это в своей инструкции proc print), которое не содержит записей с avgDonation ниже 20 и DonationAmt менее миллиона.(Я считаю, что это вопрос с подвохом, поскольку в исходном наборе данных нет случаев, соответствующих обоим критериям)

Я написал свое предложение where следующим образом: где пожертвованиеamt > = 1000000 и avgNumDonations> = 20

Однако, похоже, он действует как оператор OR вместо оператора AND, потому что мое подмножество устраняет идентификаторы 45 и 78.

Может кто-нибудь сказать мне, чего мне не хватает? Как я уже упоминал, ни один случай не соответствует критериям, поэтому я ожидал, что в моем «подмножестве» будут такие же случаи.

Комментарии:

1. Можете ли вы показать нам свой код?

Ответ №1:

Я думаю, вы можете неправильно понимать логику WHERE или AND / OR.

ГДЕ — критерий включения. Почти все ваши записи соответствуют этим критериям, но не все. Обратите внимание, что with И it должны соответствовать обоим вашим критериям, если любой из них имеет значение false, он исключается. Звучит так, как будто вы хотите ИЛИ вместо И .

Таким образом, для определения записей, которые исключены, любой из критериев будет ложным. Поэтому ищите записи, в которых numDonations <20 — (ID 45) и DonationAmount<1000000 — ID 78. Таким образом, эти две записи будут исключены. Это то, что вы видите.

Ответ №2:

Если оба критерия должны соответствовать условиям, вы должны использовать ИЛИ вместо И:

 data a;
  id=12;
  avgdon = 58.3;
  sumdon=4833722;
    output;
  id=45;
  avgdon = 15.3;
  sumdon=14833722;
    output;
  id=56;
  avgdon = 50.3;
  sumdon=9833722;
    output;
  id=78;
  avgdon = 39.3;
  sumdon=833722;
    output;
  id=910;
  avgdon = 28.3;
  sumdon=2833722;
    output;
run;

proc print data=a(where=(sumdon>=1000000 OR avgdon>=20));
run;
  

В противном случае правильно использовать AND . Затем 2 строки удаляются.