SAS:更改多个变量名称

时间:2013-11-14 16:03:25

标签: variables statistics sas

这是我目前的问题:

我在SAS数据集中有53个需要更改的变量头,例如:

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  ?  

我只是不明白正确的语法。

编辑:感谢您编辑我的格式Sergiu,感谢您! :)

编辑:

我使用了以下代码,但是我收到以下错误:
编号变量列表上缺少数字后缀(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

以下是“denorm”/ transpose

之前和之后的数据

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

2 个答案:

答案 0 :(得分: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宏生成新标签。如果变量名称也不包含TS,则可能需要更改PROC SQL中WHERE后面的逻辑。

答案 1 :(得分: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;