Как мне присвоить значение новой переменной из значения другой переменной в SAS - PullRequest
0 голосов
/ 28 февраля 2020

Поэтому я создаю новую базу данных с именем sitesweb2 из другой, называемой sitesweb, потому что я просто хочу сохранить определенные переменные. Это только двоичные переменные.

Затем я хочу создать новую переменную с именем fonction, которая будет принимать:

  • Значение 1, если в переменных MNOPQRSTU есть 1.
  • Значение 2, если в переменных AA AB есть A C AD AE AF AG AH AI AJ.
  • Значение 3, если в переменных AK AL есть 1.

У меня есть следующий код, но он не создает переменную fonction:

Data DEV1.SITESWEB2;
set DEV1.SITESWEB ; 
keep INDUSTRIE M N O P Q R S T U AA AB AC AD AE AF AG AH AI AJ AK AL ;
if M or N or O or P or Q or R or S or T or U in ('1') then fonction = 1 ;
else if AA or AB or AC or AD or AE or AF or AG or AH or AI or AJ in ('1') then fonction = 2;
else if AK or AL in ('1') then fonction = 3;
run;

Что не так?

Ответы [ 3 ]

0 голосов
/ 28 февраля 2020

Проверка на '1' в результате объединения массива, который ссылается на переменные.

array _1_vars M N O P Q R S T U;
array _2_vars AA AB AC AD AE AF AG AH AI AJ;
array _3_var3 AK AL;

select;
  when (index(cats(of _1_vars(*),'1') then fonction = '1';
  when (index(cats(of _2_vars(*),'1') then fonction = '2';
  when (index(cats(of _3_vars(*),'1') then fonction = '3';
  otherwise ;
end;

Это будет работать как для символьных, так и для числовых c переменных. Все переменные массива должны быть одного типа.

0 голосов
/ 28 февраля 2020

Чтобы проверить, появляется ли значение в списке переменных, вы можете использовать функцию WHICH () или WHICH C (). Он вернет номер переменной, где он был впервые найден. Если не найден, он вернет ноль. SAS рассматривает 0 как ложное, а любое другое число как истинное.

data DEV1.SITESWEB2;
  set DEV1.SITESWEB ;
  keep INDUSTRIE M N O P Q R S T U AA AB AC AD AE AF AG AH AI AJ AK AL ;
  if whichc('1', of M N O P Q R S T U) then fonction = 1 ;
  else if whichc('1', of AA AB AC AD AE AF AG AH AI AJ) then fonction = 2;
  else if whichc('1', of AK AL) then fonction = 3;
  keep fonction ;
run;

Обязательно сохраняйте свою новую переменную.

0 голосов
/ 28 февраля 2020

Требуется оператор / правый операнд для каждой переменной. Это не соответствует условию: -

If M='1' or N='1' or ... then fonction=1;

Если бы они были числовыми переменными, вы могли бы добавить их в функцию суммы:

if sum(M,N,...)>=1 then...

, но, очевидно, они являются текстовыми переменными, а не действительными двоичными числами. (число) переменных.

Между прочим, я уверен, что вы могли бы также использовать функции %do l oop и asc() внутри %sysfunc(), передавая соответствующие числа ascii, чтобы перебрать переменные алфавита и затем передать результаты как макропеременные в шаге данных для автоматизации построения if. Это требует немного больше усилий, но если вы неоднократно запускаете это, это более элегантное решение.

Надеюсь, это поможет,

Фил

...