SAS数据步骤编程

时间:2018-11-01 17:47:12

标签: sas

SAS数据步骤编程 谢谢

2 个答案:

答案 0 :(得分:0)

您可以结合使用infile column=input保持输入@修饰符来确定保持输入何时经过尾随逗号,以表示将要缺少的值。解释为零units_purchased的情况。自动变量_infile_用于检查何时输入语句将自身定位为下一次读取超出数据线的长度。

data want;
  infile datalines dsd dlm=',' column=p;
  attrib id length=$8 units_purchased length=8 ;

  input id @; * held input record;

  * loop over held input record;
  do while (p <= length(_infile_)+1);  * +1 for dealing with trailing comma;

    input units_purchased @; * continue to hold the record;
    if missing(units_purchased) then units_purchased = 0;

    output;
  end;
datalines;
C005,3,15,,39
D2356,4,11,,5
A323,3,10,15,20
F123,1,
run;

在这种情况下,有时不会使用更容易使用的@@修饰符,因为缺少的值将被视为有效输入,因此不能用于断言“不再有数据”条件。 / p>

答案 1 :(得分:0)

由于数据包含值的数量,因此可以使用它来控制DO循环以读取值。我不确定为什么您会丢失按值顺序排列的信息,因此我注释掉了KEEP语句。为了将缺失值转换为零,我使用了sum语句。您可以使用IF / THEN语句或COALESE()函数调用或其他方法将缺失值转换为零。

data Purchase;
  infile 'c:\temp\PurchaseRecords.dat' dsd truncover ;
  length id $8 ;
  input id visit_no @ ;
  do visit=1 to visit_no ;
    input unitpurchased @;
    unitpurchased+0;
    output;
  end;
  * keep id unitpurchased;
run;

您的原始程序有一些错误:

  • 引号字符错误。使用普通的ASCII单引号或双引号字符。
  • 它仅从第8列读取ID的值。我发现最好使用LENGTH语句来定义变量,而不是强迫SAS猜测如何定义变量。
  • input语句尝试使用列指针运动命令@nnn,这是不正确的。加上尚未将指针移至unitpurchased的变量位置,没有赋值。
  • 未尝试从该行读取多个值。
  • 您没有在truncover语句中包含missover(甚至是较旧的infile)选项。