SAS: преобразование символа в числовой без создания другой переменной

Я хочу, чтобы преобразовать x в числовые.

DATA test;
  input x .;
  cards;
  1
  2
  0
  ;
run;

Я пробовал разные способы:

  • С *1 :

    /* trial1 */
    DATA test1;
      SET test;
      x = x*1;
    run;
    

журнал печатает следующее примечание :

NOTE: Character values have been converted to numeric values at the places given by: (Line):(Column).
      2470:3
NOTE: Numeric values have been converted to character values at the places given by: (Line):(Column).
      2470:4

и формат не меняется.

  • С input() :

    /* trial2 */
    DATA test2;
      SET test;
      x = input(x,BEST1.);
    run;`
    

журнал печатает следующее примечание :

NOTE: Numeric values have been converted to character values at the places given by: (Line):(Column).
  2396:3

и формат не изменение.

  • С informat :

    /* trial3 */
    DATA test3;
      SET test;
      informat x BEST1.;
    run;
    

журнал печатает следующую ошибку:

ERROR 48-59: The informat $BEST was not found or could not be loaded.

, который пояснил,здесь и здесь : компилятор обнаруживает различные типы для переменной и формата, предполагает, что это ошибка, добавьте предполагаемый-отсутствует $ и поэтому не находит формат.

все эти испытания будут работать, если я создал вторую переменную, как для пример :

DATA test4;
  SET test (rename=(x=x2));
  x = x2*1;
  drop x2;
run;

но я пытаюсь очистить свой код, и мне интересно, есть ли способ сделать такое преобразование без этого ?

3 ответов


как отмечалось в другом месте, вам нужно использовать вторую переменную. SAS не позволит вам напрямую изменять тип переменной столбца, но вы можете обмануть вещи, используя rename аналогичным образом, как указано выше.

единственное, что я собираюсь предложить, отличается от ответа NEOmen или вашего выше, это использование input. Длина/назначение или использование *1 метод оба в порядке, но они полагаются на автоматическое преобразование типа SAS, которое добавит примечание к вашему журналу, что он это делает. Вы должны избегайте таких вещей в своем журнале, поскольку они грязные и заставляют других думать, что вы могли сделать это случайно.

использование тестового набора данных NEOmen:

data test1;
  set test(rename=x=x_old);
  x=input(x_old,best12.); *whatever is appropriate informat for your variable;
run;

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

DATA test;
input x .;
cards;
1
2
0
;
run;

data test1(drop=x_old);
length x 8.;
set test(rename = (x=x_old));
x=x_old;
run;

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

следующее решение предпочтительнее, если целью является обновление целевого объекта "на месте" (хотя это все равно вызовет проблемы, если целевой столбец сам находится в индексе):

%let changeds=test;
%let changevar=x;

DATA &changeds;
input &changevar .;
cards;
1
2
0
;
run;

proc datasets lib=work noprint;
  modify &changeds;
    rename &changevar=_willerrorifthisvarexists_;
run;

proc sql;
alter table &changeds add &changevar num;
update &changeds set &changevar=input(_willerrorifthisvarexists_,best.);
alter table &changeds drop  _willerrorifthisvarexists_;