2013-11-14 3 views
0

Это мой текущий вопрос:SAS: Изменение нескольких имен переменных

У меня есть 53 переменных заголовков в наборе данных SAS, которые должны быть изменены, например:

Current_Week_0 TS | Current_Week_1 TS | Current_Week_2 TS -- etc. 

мне это нужно изменить такие, что Current_Week_# TS = Current_Week_# -- dropping the TS

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

i = 0,53 
Current_week_i TS = Current_Week_i ? 

Я просто не понимаю правильного синтаксиса.

Редактировать: Спасибо, что редактировали мои форматы Серджиу, оцените! :)

Edit:

Я использовал следующий код, но я получаю следующее сообщение об ошибке:
Missing числовой суффикс нумерованного списка переменных (TS-Current_Week_53)

 DATA True_Start_8; 
     SET True_Start_7; 
      ARRAY oldnames (53) Current_Week_1 TS-Current_Week_53 TS; 
      ARRAY newnames (53) Current_Week_1-Current_Week_53; 
      DO i = 1 TO 53; 
       newnames(i) = oldnames(i) ; 
      END; 
    RUN; 

@ Joe EDIT

Вот как выглядят данные до и после «денорма»/транспонирования

ПЕРЕД

Product  ID  CurrentWeek   Market TS 
X   75av2kz  Current_Week_0 Z  1 
Y   7sav2kz  Current_Week_0 Z  1 
X   752v2kz  Current_Week_1 Z  1 
Y   255v2kz  Current_Week_1 Z  1 


Product  ID  Market Current_Week_0_TS Current_Week_1_TS 
X   75av2kz  Z   1     0 
Y   7sav2kz  Z   1     1 
X   752v2kz  Z   1     1 
Y   255v2kz  Z   1     0 
+0

Является ли это то, что вы хотите: http://stackoverflow.com/questions/5056397/in-sas-use-loop-to-rename-indexed-columns? –

+0

Звучит так, но я думаю, что есть лучшие ответы. – Joe

+0

Привет, Barjey - Я ценю ответ, и я действительно попытался использовать код, который был в этом ранее отвеченном вопросе. Я думаю, что моя проблема - это «TS» в конце, что затрудняет SAS выполнение цикла «i»? Выше я добавил код, который я попытался использовать. – mmichaelx

ответ

0

Это не так уж сложно. Я предполагаю, что это переменные метки.

proc sql; 
    select cats('%relabel_nots(',name,')') into :relabellist separated by ' ' 
    from dictionary.columns 
    where libname='WORK' and memname='True_Start_7' 
    and name like '%TS'; *you may need to upper case the dataset name (memname) depending on your OS; 
    quit; 
%macro relabel_nots(name); 
label &name.= substr(vlabel(&name.),1,length(vlabel(&name.))-3); 
%mend relabel_nots; 

data want; 
set True_Start_7; 
&relabellist.; 
run; 

В основном PROC SQL захватывает различные имена, которые квалифицируются для Перемаркировка и генерирует большую Макропеременную со всей переименованью макровызов. Макрос relabel_nots генерирует новые метки. Возможно, вам придется изменить логику WHERE в PROC SQL, если имена переменных также не содержат TS.

+0

Hi @Joe - я очень ценю вашу помощь, и я очень рад погрузиться в этот код, чтобы полностью понять, что он делает - но когда я запустил его в своем текущем коде, я получаю следующую ошибку '601 данных хотят,' ' 602 набор True_Start_7,' ' 603 & relabellist;' ' -' ' 180' '. ПРЕДУПРЕЖДЕНИЕ: Видимая символическая ссылка RELABELLIST не resolved.' ' ОШИБКА 180-322: Заявление является недействителен или используется из надлежащего порядка. « '604 run;' – mmichaelx

+0

Я думаю, что в proc sql просто отсутствует 'quit;' после строки 'и имя типа '% TS';' – scott

+0

@scott Я добавил 'quit;' и он все еще создал тот же ошибка - как он упоминал о ярлыке против имени - эта часть немного запутывает меня немного ~ – mmichaelx

0

Другой вариант - сделать это в транспорте. Данные вашего примера либо не соответствуют примеру желаемого результата, либо что-то в логике не объяснено, но это делает простой транспозицию; если есть логическая причина, что current_week_0/1 различны в вашей, чем в ниже, объясните, почему.

data have; 
format currentWeek $20.; 
input Product $ ID $ CurrentWeek $ Market $ TS; 
datalines; 
X   75av2kz  Current_Week_0 Z  1 
Y   7sav2kz  Current_Week_0 Z  1 
X   752v2kz  Current_Week_1 Z  1 
Y   255v2kz  Current_Week_1 Z  1 
;;;; 
run; 

proc sort data=have; 
by market id product; 
run; 
proc transpose data=have out=want; 
by market id product ; 
id currentWeek; 
var TS; 
run; 
Смежные вопросы