我想導入SAS中具有重複列名的CSV文件。例如如何導入包含SAS中重複列名的csv文件
名爲abc ABC高清畫質
都在我的文件中的列名。
當我嘗試導入SAS文件,它會自動重命名變量VAR1,VAR2等
我想保留原來的列名。我怎樣才能做到這一點?
我想導入SAS中具有重複列名的CSV文件。例如如何導入包含SAS中重複列名的csv文件
名爲abc ABC高清畫質
都在我的文件中的列名。
當我嘗試導入SAS文件,它會自動重命名變量VAR1,VAR2等
我想保留原來的列名。我怎樣才能做到這一點?
從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;
如果什麼列的數量太多,我怎麼能那麼手動重命名呢? – user1946152
有沒有什麼辦法可以讓SAS爲重複項添加數字後綴,如abc abc1 abc 2用於名稱爲abc的列? – user1946152
您可以通過幾種不同的方式做到這一點。最簡單的方法來做你的例子,如圖所示:
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;
當我嘗試使用導入嚮導和相同的代碼輸入你貼在運行,它會自動重命名列 – user1946152