2013-02-14 2 views
0

Я работаю с данными опроса, где имена переменных в нашей базе данных являются описательными, а не последовательно пронумерованы. Они являются последовательными в базе данных (перемещение слева направо). Я хотел бы работать в моих программах с пронумерованными переменными, и я неудачно пытался переименовать их программно, не записывая каждые изменение вручную (имеется 87 переменных).Переименовать имена несущественных переменных в последовательные имена в sas

Я попытался использовать array, но это не сработало, поскольку они не называются последовательно и не имеют общей структуры (нет общего префикса или суффикса).

Пример данных ниже:


data svy; 
    input id relationship outburst checkwork goodideas ; 
cards; 
101 3 4 5 6 
102 4 5 6 6 
103 1 1 8 1 
104 2 3 2 4 
; 
run; 

***** does not work ; 
data svy_1; set svy; 
rename relationship--goodideas = var01--var04; 
run; 
quit; 

Приведенный выше код возвращает следующее сообщение об ошибке в журнале:

ERROR: Missing numeric suffix on a numbered variable list (relationship-goodideas). 

Я хотел бы переименовать переменные что-то вроде : var01, var02 и т. д.

Любая помощь очень ценится.

ответ

1

коллега придумал лучший подход:


***** does work ; 

data svy_1; 
set svy; 
array old { 4 } relationship--goodideas; 
array var { 4 } ; 

do i = 1 to 4; 
var[i] = old[i]; 
end; 
drop i; 
run; 

1

Несколько вещей:

Ваши данные шаг # 2 не прав - это не есть набор заявление. Кроме того, он не требует «quit» - выход - это только для определенных PROC, которые обычно являются «средами программирования», такими как PROC SQL, PROC FORMAT, PROC DATASETS. Это не наносит вреда, но выглядит нечетно :)

Переменные переменных с последовательным в-наборе данных имеют двойную тире. Таким образом, вы могли бы тривиальным создать массив с этим:

array myvars relationship--goodideas; 

Так что, если это достаточно хорошо для вас (не переименования), а затем, пойти на это. Если вы действительно хотите переименовать их (немного плохой идеей IMO, поскольку она убирает некоторое значение имени переменной, делая код более трудным для чтения, хотя я понимаю, почему вы хотите), вы не можете использовать это, к сожалению, в то время как это правильно, оператор RENAME не поддерживает его.

82 ***** does not work ; 
83 data svy_1; 
84 rename relationship--goodideas = var01-var04; 
      ------------ 
      47 
ERROR 47-185: Given form of variable list is not supported by RENAME. Statement is ignored. 

85 run; 

Вы не можете использовать массив для выполнения операций переименования, к сожалению; так что вам придется делать что-то еще. Вот один ответ.

proc contents data=svy out=svy_vars(keep=name varnum) noprint; 
run; 

proc sort data=svy_vars; 
by varnum; 
run; 

data for_rename; 
set svy_vars; 
if name in ('relationship' 'outburst' 'checkwork' 'goodideas') then do; 
    namectr+1; 
    new_name=cats(name,'=','var',put(namectr,z2.)); 
    output; 
end; 
run; 

proc sql; 
select new_name into :renlist separated by ' ' from for_rename; 
quit; 

proc datasets nolist; 
modify svy; 
rename &renlist; 
quit; 

Вы можете сделать что-то подобное в более короткие моды с использованием PROC SQL и таблицу DICTIONARY.COLUMNS или шаг данных и SASHELP.VCOLUMN, но метод содержание Учеб является несколько более прозрачным, как к тому, что происходит. Если у вас более четырех переменных, вы можете захотеть изменить этот оператор IN на отрицательный оператор (если имя не указано (список вещей не изменяется)), если это проще или даже использовать переменную VARNUM, чтобы определить, какие переменные вы хотите изменить (если там будет работать varnum в (2: 5)).

+0

Спасибо за головы на ошибки кода. Исправлено сейчас ... –

Смежные вопросы