2015-01-30 2 views
2

У меня есть таблица, описание которого, как показан в срубе:Как преобразовать обугленный тип данных числового типа данных в SAS

create table WORK.EMP(bufsize=65536) 
(

    Series_Name char(21) format=$21. informat=$21., 
    Series_Code char(17) format=$17. informat=$17., 
    Country_Name char(19) format=$19. informat=$19., 
    Country_Code char(3) format=$3. informat=$3., 
    _2000__YR2000_ char(12) format=$12. informat=$12., 
    _2001__YR2001_ char(12) format=$12. informat=$12., 
    _2002__YR2002_ char(12) format=$12. informat=$12., 
    _2003__YR2003_ char(12) format=$12. informat=$12., 
    _2004__YR2004_ char(11) format=$11. informat=$11., 
    _2005__YR2005_ char(11) format=$11. informat=$11., 
    _2006__YR2006_ char(11) format=$11. informat=$11., 
    _2007__YR2007_ char(12) format=$12. informat=$12., 
    _2008__YR2008_ char(12) format=$12. informat=$12., 
    _2009__YR2009_ char(12) format=$12. informat=$12., 
    _2010__YR2010_ char(12) format=$12. informat=$12., 
    _2011__YR2011_ char(12) format=$12. informat=$12., 
    _2012__YR2012_ char(12) format=$12. informat=$12., 
    Total12 num label='Total12' 
    ); 

Теперь я хочу подвести столбцы с 2000 года до 2012 года и положить результат в столбец с именем «Total12», но сначала я должен преобразовать типы данных «char» в «int» для выполнения вычислений. Я попытался следующий код в SAS:

proc sql;  
alter table emp modify _2000__YR2000_ num;  
alter table emp modify _2001__YR2001_ num;  
run; 

Но это дает мне следующую ошибку:

ERROR: You cannot alter '_2000__YR2000_' to be a numeric column.

Что я должен теперь делать?

+0

Этот тег [tag: mysql], потому что это происходит из таблицы базы данных mysql, к которой подключается SAS? Если это так, у вас есть варианты. – Joe

+0

На самом деле я новичок в sas, и я прочитал в учебниках, что мы можем использовать sql в sas, используя 'proc sql', но это не происходит из базы данных mysql. –

ответ

1

Один из способов сделать это - использовать оператор ввода на шаге данных, чтобы создать новую переменную/столбец с именем что-то другое, отбросить оригинал, а затем переименовать новую переменную в соответствие с оригиналом.

data work.want(rename=(_2000_YR2000_b=_2000_YR2000_)); 
    set work.emp; 
    _2000__YR2000_b=input(_2000__YR2000_,8.); 
    drop _2000_YR2000_; 
run; 

И так далее.

+0

И, конечно, вы могли бы написать макрос, который сделал это (через цикл) и использовать его. – Joe

+0

Большое спасибо #Apkl .... Ваш метод работает отлично .... (y);) –

+0

не стесняйтесь отметить его как правильно :) – Apkl

1

Это должно работать для вас:

data have; 
_2000__YR2000_ = "1"; 
_2001__YR2001_ = "2"; 
_2002__YR2002_ = "3"; 
_2003__YR2003_ = "4"; 
_2004__YR2004_ = "5"; 
_2005__YR2005_ = "6"; 
_2006__YR2006_ = "7"; 
_2007__YR2007_ = "8"; 
_2008__YR2008_ = "9"; 
_2009__YR2009_ = "10"; 
_2010__YR2010_ = "11"; 
_2011__YR2011_ = "12"; 
_2012__YR2012_ = "13"; 
run; 

data want; 
set have; 
array years[*] 
_2000__YR2000_ 
_2000__YR2000_ 
_2001__YR2001_ 
_2002__YR2002_ 
_2003__YR2003_ 
_2004__YR2004_ 
_2005__YR2005_ 
_2006__YR2006_ 
_2007__YR2007_ 
_2008__YR2008_ 
_2009__YR2009_ 
_2010__YR2010_ 
_2011__YR2011_ 
_2012__YR2012_ 
; 
total = sum(of years[*]); 
run; 
+2

Это будет работать, но неявный символ для числового преобразования, t обычно рекомендуется. – Reeza

+1

Хотя я согласен с @Reeza в целом, это может быть одна ситуация, с которой мне было бы хорошо, учитывая объем работы, необходимый для ее исправления. В частности, если это одноразовая программа. Если это в производственной программе (т. Е. Что-то, что будет выполняться повторно), это не очень хорошая идея (поскольку она добавляет предупреждения в журнал). – Joe

+2

Я не думаю, что автоматическое преобразование типов всегда в порядке, поскольку оно может маскировать ошибки в коде. Приведенное сообщение является тем же сообщением, которое задается, когда вы ошибочно вводите имя переменной (т. Е. Совершаете ошибку), и вы можете продолжать дальше, не задумываясь над этим. Автоматическое преобразование типов = плохая практика. Не делай этого. Когда-либо. –

1

Макрос не является необходимым, если имена переменных находятся в хорошей форме.

data test; 
    set have; 
    array year20{*} _20:; 
    call missing(year); 
    do i = 1 to dim(year20); 
     year = sum(year, input(year20{i}, ?? best.)); 
    end; 
run; 
Смежные вопросы