这是我目前的问题:
我在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
答案 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;