2015-10-08 2 views
0

Я пытаюсь изменить имена переменных в таблице/наборе данных. Я просмотрел несколько веб-сайтов и этот дискуссионный форум, но мне не удалось найти код, который будет работать должным образом в моем случае (я новичок в SAS).SAS - переменные переименования

Мой набор данных содержит 103 столбца, и я хотел бы переименовать первые 100 столбцов. Имя первого столбца - это CFT (1), CFT (2) второго столбца, ..., CFT (100) 100-го столбца. Новые переменные можно вызвать, например, CFT_n (1), ..., CFT_n (100).

код я использую следующее:

data vystup_m200_b; 
set vystup_m200_a; 
rename 'cft(1)'n - 'cft(100)'n='cft(1)_n'n - 'cft(100)_n'n; 
run; 

Но я получаю сообщение об ошибке с указанием:

Aplhabetic prefixes for enumerated variables (cft(1)-cft(100)) are different. 

Благодарим Вас за любое предложение, что я делаю неправильно.

+0

Я думаю, вы импортировали набор данных из где-нибудь еще, так как столбца или переменные-имена с кронштейнами нет действительного SAS - имена (afaik по крайней мере в 9.2+). Поэтому я предполагаю, что это вызовет у вас серьезные проблемы при работе с ними в коде. Я бы предположил, что вы не можете переименовать это в sas-code. Даже если это будет работать, переименование нескольких переменных/столбцов таким образом требует, чтобы суффикс был числовым, на данный момент) в вашей базовой дате и должен стать) _n в новых данных, это невозможно сделать автоматически в этом случае. – kl78

+0

'Специальные символы, за исключением подчеркивания, не допускаются. Только в filerefs вы можете использовать знак доллара ($), знак фунта (#) и знак (@). 'Https://support.sas.com/documentation/cdl/en/lrcon/62955/HTML/ default/viewer.htm # a000998953.htm – kl78

+0

Я вижу, хорошо, я буду импортировать его под разными именами. Большое спасибо. –

ответ

2

Даже с validvarname = любой числовой суффикс в списке нумерованных переменных должен иметь номер в качестве последней части имени. Вы можете «использовать» функции PROC TRANSPOSE, чтобы перевернуть данные, чтобы переименовать переменные. Это целесообразно только в том случае, если данные довольно малы.

data ren; 
    array _a[*] 'cft(1)'n 'cft(2)'n 'cft(3)'n (1 2 3); 
    do i = 1 to 10; 
     output; 
     end; 
    drop i; 
    run; 
proc transpose data=ren out=ren2; 
    run; 
proc transpose data=ren2 out=renamed(drop=_name_) suffix=_N; 
    id _name_; 
    run; 

enter image description here

1

Если переменные последовательно названы, простой макрос будет достаточно:

option validvarname = any; 

data ren; 
    array _a[*] 'cft(1)'n 'cft(2)'n 'cft(3)'n (1 2 3); 
    do i = 1 to 10; 
     output; 
     end; 
    drop i; 
run; 


%macro rename_loop; 
    %local i; 
    %do i = 1 %to 3; 
     "cft(&i)"n = "cft(&i)_n"n 
    %end; 
%mend rename_loop; 

proc datasets lib = work nolist nowarn nodetails; 
    modify ren; 
    rename %rename_loop; 
    run; 
quit; 

Это должно работать более или менее мгновенно, независимо от размера набора данных, как это требуется только обновить метаданные.

0

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

data ren; 
    array _a[*] 'cft(1)'n 'cft(2)'n 'cft(3)'n (1 2 3); 
    do i = 1 to 10; 
     output; 
     end; 
    drop i; 
    run; 
proc print; 
    run; 
proc transpose data=ren(obs=0) out=ren2; 
    run; 
proc sql noprint; 
    select catx('=',nliteral(_name_),nliteral(cats(_name_,'_n'))) 
     into :renamelist separated by ' ' 
    from ren2; 
    quit; 
    run; 
%put NOTE: &=renamelist; 
proc datasets nolist; 
    modify ren; 
    rename &renamelist; 
    run; 
    contents data=ren varnum short; 
    quit; 

enter image description here

+0

Приятный подход, но искатель хочет только переименовать 100 столбцов из 103 в их наборе данных. Как написано, это также переименует остальные 3. – user667489

+0

Просто используйте данные DROP, установленные на входных данных в PROC TRANSPOSE data = mydata (obs = 0 drop = one two three) –

0

Другим решением, которое переименование переменных после загрузки:

proc import datafile="\\folder\RUN_00.xlsx" 
dbms=xlsx out=run_00 replace; 
run; 

data rename; 
length ren $32767; 
set run_00(obs= 1); 
keep ren delka; 
array cfte{*} CFT:; 
do i=1 to dim(cfte); 
ren=strip(ren)||" 'cft("||strip(i)||")'n='cft_"||strip(i)||"_00'n"; 
delka=length(ren); 
end; 
call symputx("renam",ren); 
run; 

proc datasets library=work; 
modify run_00; 
rename &renam; 
run; 
Смежные вопросы