SAS Proc导入CSV和丢失的数据
所以,我试图在SAS中导入一些数据集并加入它们,唯一的问题是,加入它们后我会出现这个错误-SAS Proc导入CSV和丢失的数据,csv,dataframe,sas,missing-data,Csv,Dataframe,Sas,Missing Data,所以,我试图在SAS中导入一些数据集并加入它们,唯一的问题是,加入它们后我会出现这个错误- proc import datafile='filepath/datasetA.csv' out = dataA dbms= csv replace; run; proc import datafile='filepath\datasetB.csv' out = dataB dbms= csv replace; run;
proc import datafile='filepath/datasetA.csv'
out = dataA
dbms= csv
replace;
run;
proc import datafile='filepath\datasetB.csv'
out = dataB
dbms= csv
replace;
run;
/* combine them all into one dataset*/
data DataC;
set &dataA. &dataB;
run;
ERROR: Variable column_k has been defined as both character and numeric
在我试图加入的两个数据集中,所讨论的列看起来都是这样的-
+----------+
| column_k |
+----------+
| 0 |
| 1 |
| 5 |
| 4 |
| NA |
| NA |
| 4 |
| 3 |
| NA |
+----------+
基本上,如果可能的话,我想将该列中的NA数据作为“缺失”导入?我需要整个列保持数字,因为我计划用该列中的数据做一些数学方面的工作
谢谢你的帮助
proc import
是一个猜测过程,通过检查几行数据来工作。这是一个问题,因为Excel数据单元格没有任何数据类型。列可以在不同的单元格中包含文本、日期、日期时间和数值
因此,最好使用指定变量类型的infle
语句:
filename input 'filepath/datasetA.csv';
data dataA;
infile input truncover firstobs=2/*reads from the second line*/;
input column_k;/*here you should specify input variables. If you want to read column_k as character, use : "input column_k $100." with specified length*/
run;
filename input clear;
输入(csv文件):
输出(sas数据集数据A):
proc import
是一个猜测过程,通过检查几行数据来工作。这是一个问题,因为Excel数据单元格没有任何数据类型。列可以在不同的单元格中包含文本、日期、日期时间和数值
因此,最好使用指定变量类型的infle
语句:
filename input 'filepath/datasetA.csv';
data dataA;
infile input truncover firstobs=2/*reads from the second line*/;
input column_k;/*here you should specify input variables. If you want to read column_k as character, use : "input column_k $100." with specified length*/
run;
filename input clear;
输入(csv文件):
输出(sas数据集数据A):
如果希望继续使用
Proc IMPORT
,则需要确保列与键入的列相同。在您的情况下,您知道列k
应该是数字的,因此数据
步骤可以使用输入
功能将字符值转换为数字
proc import … out = dataA;
proc import … out = dataB;
data dataA;
set dataA;
_num = input(column_k, best12.);
drop column_k;
rename _num = column_k;
run;
data dataB;
set dataB;
_num = input(column_k, best12.);
drop column_k;
rename _num = column_k;
run;
data want;
set dataA dataB;
run;
在更大范围内,列名的数据类型不匹配可能会在处理多年导入之类的场景中发生
假设旧数据无法重新读取,而新数据具有不同的列类型
对于需要数值的情况,一种方法是使用宏编写源代码,必要时将指定变量从字符转换为数字
例如:
%enforce_num (perm.loans2015, age amount remaining, out=work.loans2015)
%enforce_num (perm.loans2016, age amount remaining, out=work.loans2016)
%enforce_num (perm.loans2017, age amount remaining, out=work.loans2017)
data loans_3yrs;
set work.loans2015-loans2017;
run;
回到更简单的情况:
proc import … out = dataA;
proc import … out = dataB;
%enforce_num(dataA, column_k)
%enforce_num(dataB, column_k)
data want;
set dataA dataB;
run;
宏enforce_num
看起来像什么?它必须:
- 扫描输入数据集元数据
- 确定变量是否为指定的变量之一,是否为字符类型
- 编写源代码以将变量转换为数字
- 保持原始可变顺序
%macro-enforce_-num(数据、变量、输出=&data);
/*
*论据:
*data—输入数据集的名称
*vars-以空格分隔的变量列表,这些变量必须是数字,必要时转换为类型
*out—输出数据集的名称,默认值与输入数据集相同
*
*输出:
*-如果数据和输出相同且无需转换,则未更改数据集
*-如果数据中的某些列需要转换为数字,则更改数据集
*-如果输出与数据相同,则替换数据
*-如果输出不同,则替换输出数据
*-更改数据集的列顺序将与原始数据集相同
*/
%本地dsid索引index2 vars varname vartype varnames debug;
%设index2=0;%*确定需要转换的变量数量;
%设debug=0;
%如果&debug%,则%put注释:&SYSMACRONAME:data=%superq(数据);
%让dsid=%sysfunc(打开(&data));
%如果&dsid%,则为%do;
%do index=1%到%sysfunc(attrn(&dsid,nvars));
%让varname=%sysfunc(varname(&dsid,&index));
%让varnames=&varnames&varname;
%如果%sysfunc(indexw(&varname,&vars))%,则%do;
%如果C=%sysfunc(vartype(&dsid,&index))%,则%do;
%*数据包含需要强制执行的字符变量;
%设index2=%eval(&index2+1);
%本地转换&index2;
%让convert&index2=&varname;
%设varnames=&varnames__;&index2;%*将被转换的变量在转换过程中将被命名为_u;
%结束;
%结束;
%结束;
%让dsid=%sysfunc(关闭(&dsid));
%结束;
%否则
%放置%sysfunc(sysmsg());
%*注:&=变量;
%*注意:&=varnames;
%如果&index2=0%,则为%do;
%*无需将列转换为数字,如有必要,请复制到输出;
%如果数据为ne&out%,则为%do;
数据输出;
集合与数据;
跑
%结束;
%返回;
%结束;
%*某些列需要转换为数字;
%*确保转换后的列与原始数据集中的列位于同一位置(varnum);
数据输出;
保留&varname;
集合与数据;
%do指数=1%至&index2;
___&索引=输入(&&convert&index,?best12.);
%结束;
滴
%do指数=1%至&index2;
&&转换和索引
%结束;
;
改名
%do指数=1%至&index2;
___&索引=&&convert&index
%结束;
;
跑
%请注意:------------------------------------------------------------;
%请注意:&数据已接受数字强制执行。;
%请注意:------------------------------------------------------------;
%补强补强;
如果希望继续使用Proc IMPORT
,则需要确保列与键入的列相同。在您的情况下,您知道列k
应该是数字的,因此数据
步骤可以使用输入
功能将字符值转换为数字
proc import … out = dataA;
proc import … out = dataB;
data dataA;
set dataA;
_num = input(column_k, best12.);
drop column_k;
rename _num = column_k;
run;
data dataB;
set dataB;
_num = input(column_k, best12.);
drop column_k;
rename _num = column_k;
run;
data want;
set dataA dataB;
run;
在更大范围内,列名的数据类型不匹配可能会在处理多年导入之类的场景中发生
假设旧数据无法重新读取,而新数据具有不同的列类型
对于需要数值的情况,一种方法是使用宏编写源代码,必要时将指定变量从字符转换为数字
例如:
%enforce_num (perm.loans2015, age amount remaining, out=work.loans2015)
%enforce_num (perm.loans2016, age amount remaining, out=work.loans2016)
%enforce_num (perm.loans2017, age amount remaining, out=work.loans2017)
data loans_3yrs;
set work.loans2015-loans2017;
run;
回到更简单的情况:
proc import … out = dataA;
proc import … out = dataB;
%enforce_num(dataA, column_k)
%enforce_num(dataB, column_k)
data want;
set dataA dataB;
run;
宏enforce_num
看起来像什么?它必须:
- 扫描输入数据集元数据
- 确定变量是否为指定的变量之一,是否为字符类型
- 写sourc