Многочлены из символьной формы в числовую (SAS)

У меня есть набор данных SAS, который содержит один столбец полиномов. Например, X1**(-2)+X1**(2).

Есть ли функция для преобразования этого в числовое выражение?

Большое спасибо,


person Indunil Ruhunuhewa    schedule 25.07.2015    source источник
comment
Пожалуйста, подтвердите - у вас есть набор данных, содержащий символьную переменную, значения которой являются полиномиальными выражениями? У вас уже есть числовая переменная с именем x1 в том же наборе данных?   -  person user667489    schedule 25.07.2015
comment
Да, переменная X1 является непрерывной переменной.   -  person Indunil Ruhunuhewa    schedule 25.07.2015


Ответы (2)


Если я вас правильно понял, я не думаю, что есть конкретная функция, которая легко позволит вам это сделать. У вас есть два варианта: написать собственную логику для интерпретации полиномиальных выражений или использовать call execute, чтобы SAS записал для вас (потенциально очень длинный) шаг данных, предполагая, что все полиномы введены как действительный код шага данных. Вот call execute подход:

data have;
input x1 polynomial $255.;
infile datalines truncover;
datalines;
1 X1**(-2)+X1**(2)
2 X1**(-1)+X1**(1)
3 X1**(1)+X1**(-1)
;
run;

data _null_;
 set have end = eof;
 if _n_ = 1 then call execute('data want; set have; select(_n_);');
 call execute(catx(' ','when(',_N_,') y =',polynomial,';'));
 if eof then call execute('end; run;');
run;
person user667489    schedule 25.07.2015

Преобразуйте их в макропеременные, а затем преобразуйте их в вычисление...

Используя пример набора данных в ответе пользователя667489:

/* Create numbered macro variables, 1 per row of data */
data _null_ ;
  set have end=eof ;

  call symputx(cats('POLY',_n_),polynomial) ;
  if eof then call symputx('POLYN',_n_) ;
run ;

%MACRO ROWLOOPER ;
  %DO N = 1 %TO &POLYN ;
    if _n_ = &N then result = &&POLY&N ;
  %END ;
%MEND ;

data want ;
  set have ;

  /* Not very efficient, looping over all polynomials on each row of data */  
  /* So for 3 rows, you'll perform 9 iterations here */
  %ROWLOOPER ;
run ;

Или, в качестве альтернативы, запишите свой набор данных в программу SAS и %inc эту программу:

data _null_ ;
  file "polynomials.sas" ;
  set have end=eof ;
  if _n_ = 1 then do ;
    put "data poly;" ;
    put "  set have;" ;
  end ;

  put "  result = " polynomial ";" ;

  if eof then put "run;" ;
run ;

%inc "polynomials.sas" ;
person Chris J    schedule 25.07.2015