Проверить, существует ли переменная

Я хочу проверить, существует ли переменная, и если нет, создать ее.


person Murray    schedule 14.04.2011    source источник
comment
Вы не можете условно создать переменную на шаге DATA. Возможно, вы хотите написать код, который проверяет, есть ли в наборе данных определенная переменная, и, если нет, использовать шаг DATA для создания новой версии набора данных, которая добавляет требуемый столбец и дает ему разумное значение по умолчанию?   -  person Tom Quarendon    schedule 19.04.2011
comment
Лучшим решением может быть abort;, если входные данные не соответствуют спецификациям.   -  person StasK    schedule 23.10.2015


Ответы (4)


Можно использовать функции open()&varnum(). Ненулевой вывод из varnum() указывает на то, что переменная существует.

data try; 
    input var1 var2 var3;
    datalines;
    7 2 2
    5 5 3
    7 2 7
; 

data try2; 
    set try;
    if _n_ = 1 then do; 
        dsid=open('try'); 
        if varnum(dsid,'var4') = 0 then var4 = .; 
        rc=close(dsid);
    end;
    drop rc dsid;    
run;
person Murray    schedule 15.04.2011
comment
Не забудьте close() свой набор данных после того, как откроете его с помощью функции open(). - person cmjohns; 16.04.2011
comment
Open и varnum здесь не нужны, не так ли? Разве вы не можете просто сказать data try2; переменная4=.; установить попробовать;. В приведенном примере он будет выполнять open и varnum на каждой итерации, что довольно неэффективно, поэтому их следует по крайней мере охранять, если _N_=1 тогда. - person Tom Quarendon; 19.04.2011
comment
Мне нужно проверить, что var4 существует, так что если это произойдет, его содержимое будет сохранено. Предлагаемый data try2; var4=.; set try; перезапишет любые данные в уже существующей переменной. - person Murray; 01.06.2011
comment
Поскольку вы пытаетесь сделать это на том же этапе, это действительно не лучше, чем другие ответы. Как только компилятор увидит упоминание var4, он создаст его в наборе данных. То, что происходит во время выполнения, не имеет никакого значения. - person Tom; 19.06.2018

data try2;
    set try;
    var4 = coalesce(var4,.);
run;

(при условии, что var4 является числовым)

person marq    schedule 24.10.2012
comment
Это хорошо. При этом вы можете назначить любое значение по умолчанию, которое вы хотите. Но для символьных переменных вам все равно нужно будет определить длину переменной перед ее использованием. Даже если вы сначала используете его в вызове функции coalescec(), SAS по умолчанию создаст его как числовой. - person Tom; 19.06.2018

Назначьте var4 самому себе. Присваивание создаст переменную, если она не существует, и оставит содержимое на месте, если оно существует.

data try; 
    input var1 var2 var3;
    datalines;
    7 2 2
    5 5 3
    7 2 7
; 

data try2; 
    set try; 
    var4 = var4; 
run;

Просто помните, что создание var4 таким образом, когда оно не существует, будет использовать атрибуты переменных по умолчанию, поэтому вам может потребоваться использовать явный оператор attrib, если вам требуется определенное форматирование/длина и т. д.

person AndyBeans    schedule 25.11.2014
comment
Это создаст var4 в качестве числовой переменной, если ее не было во входном наборе данных. - person Tom; 19.06.2018
comment
Да, @Tom, поэтому может потребоваться явный оператор атрибута, если числовая 8. форматированная переменная по умолчанию не подходит для нужд пользователя. - person AndyBeans; 30.01.2019

Это очень поздний ответ/комментарий, но этот метод работает для меня и довольно прост (SAS 9.4). В приведенном ниже примере я использовал отсутствующие числовые и символьные переменные и присвоил значение отсутствующей символьной переменной.

    data try; 
input var1 var2 var3;
datalines;
7 2 2
5 5 3
7 2 7
; 

    data try2; 
length var4 $20;
length var5 8;
set try; 
var4 = var4; 
if var4 = ' ' then var4 = 'Not on Source File';
run;
person Skip    schedule 16.08.2016
comment
Это тот же ответ, что и предыдущий ответ от AndyBean. - person Snorex; 31.08.2016
comment
Нет, если Мюрей хочет получить информацию об отсутствии переменной во входном наборе данных! - person Dirk Horsten; 19.04.2017
comment
Это creates переменная var4 вместо проверки ее существования. Вы проверяете, является ли переменная (новая или старая) пустой или нет. - person Tom; 19.06.2018