【发布时间】:2013-08-24 11:46:57
【问题描述】:
我想在 SAS 中导入具有重复列名的 CSV 文件。示例
名称 abc abc def def
是我文件中的列名。
当我尝试在 SAS 中导入文件时,它会自动将变量重命名为 var1、var2 等。
我想保留原来的列名。我该怎么做?
【问题讨论】:
标签: sas
我想在 SAS 中导入具有重复列名的 CSV 文件。示例
名称 abc abc def def
是我文件中的列名。
当我尝试在 SAS 中导入文件时,它会自动将变量重命名为 var1、var2 等。
我想保留原来的列名。我该怎么做?
【问题讨论】:
标签: sas
您可以通过几种不同的方式进行操作。执行示例的最简单方法如下所示:
data want;
infile datalines dlm=',';
input name $ abc1-abc2 def1-def2;
datalines;
John,1,2,3,4
Jack,4,5,6,7
;;;;
run;
proc print data=want;
run;
显然 1-2 可以变成 1-35 之类的。
如果您的数据比这更复杂,使用交错变量,我建议您只阅读标题行,转置它,然后从中构造一个输入语句。
data varnames; *this dataset reads the header in only - use infile with obs option for actual csv;
input varname $ @@;
order+1; *so we can get back to proper order;
datalines;
Name abc abc def def
;;;;
run;
proc sort data=varnames; *sort by varname;
by varname;
run;
data input_statement;
set varnames;
by varname;
if first.varname then counter=0;
if not (first.varname and last.varname) then do; *if this is not the only varname with same varname;
counter+1; *increment counter;
varname=cats(varname,counter); *append counter to varname;
end;
run;
proc sort data=input_statement; *back to correct order;
by order;
run;
proc sql; *select the new names into a macro variable;
select varname into :namelist separated by ' ' from input_statement;
quit;
data want; *input them;
infile datalines dlm=',';
input (&namelist) ($); *here I just make them all CHAR. If you have all NUM except the name var,
you could leave name out of your datasets and include it separately.;
datalines;
John,1,2,3,4
Jack,4,5,6,7
;;;;
run;
【讨论】:
从docs 看来,您会将变量名放在第一行并使用GETNAMES=yes。
proc import datafile="C:\temp\test.csv"
out=shoes
dbms=csv
replace;
getnames=yes;
run;
proc print;
run;
【讨论】:
您不能在 SAS 数据集中有重复的列名。您必须将它们重命名为;如果你不喜欢 proc import 所做的事情,你可以通过 proc datasets 手动重命名它们。
proc datasets;
modify <dataset>;
rename var1=name var2=abc1 var3=abc2 var4=def1 var5=def2;
quit;
【讨论】: