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_;