我正在尝试转换看起来像这样的数据集:
A B C
2011 NH 25
2011 MA 40
2015 CA 50
2016 KY 58
我希望输出为:
B 2011 2015 2016
NH 25 - -
MA 40 - -
CA - 50 -
KY - - 58
目前我的代码是:
proc transpose data = Test out = Test2(drop = _label_);
id Year_Enter;
Var Numeric;
by Category NOTSORTED;
run;
但是,当我运行时,我的所有列名都在前面有一个下划线,如_2011,_2015,_2016。
如何防止添加下划线?
谢谢!
如果需要数据集,则可以使用有效的变量名称。变量名通常不能以数字开头。您可以使用PROC TRANSPOSE语句中的PREFIX =选项来选择数字变量值前缀的字符,以生成有效名称。因此,您可以使用PREFIX=Y
生成变量名称,如Y2011
或使用PREFIX=Year_
生成Year_2011
等名称。您可以使用IDLABEL
语句将裸数字字符串作为变量的LABEL。
proc transpose data=have prefix=Year_ out=want(drop=_name_);
by State;
id Year;
idlabel Year;
var Value;
format year 4.;
run;
proc print;
run;
proc print label;
run;
但它看起来真的想要生成一个REPORT而不是DATASET。例如,您可以使用原始数据集中的PROC REPORT创建该报告,而无需PROC TRANSPOSE。
proc report missing data=have ;
column state value,year ;
define state / group ;
define year / across ' ';
define value / sum ' ';
run;
您需要启用扩展变量名称。 SAS变量必须遵循某些naming conventions,其中一些可以被覆盖:
- 名称最长可达32个字节。
- 名称可以包含拉丁字母,数字或下划线的字母。
- 除下划线外,名称不能包含空格或特殊字符。
- 名称必须以拉丁字母(A-Z,a-z)或下划线的字母开头。
如果启用选项options validvarname=any;
,则将删除数字变量名称前面的下划线并使用扩展SAS命名规则。请参阅下面的示例。
data have;
input A B$ C;
datalines;
2011 NH 25
2011 MA 40
2015 CA 50
2016 KY 58
;
run;
options validvarname=any;
proc transpose data = have out = want(drop = _label_);
id A;
Var C;
by B NOTSORTED;
run;