SAS Proc导入CSV和丢失的数据

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;

所以,我试图在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;



    /* 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