数据步骤中的多个To子句

时间:2019-01-25 20:48:52

标签: sas

我有一个数据步骤,其中有几列需要与另一列绑定。

我尝试使用多个“ from”语句和“ to”语句以及其他几个排列,但似乎没有办法解决问题。代码看起来像这样:

data analyze;
set css_email_analysis;
from = bill_account_number;
to = customer_number;
output;
from = bill_account_number;
to = email_addr;
output;
from = bill_account_number;
to = e_customer_nm;
output;
run;

我想在“从”列中看到两列显示帐单帐户,在“到”中显示其他值,但是我却得到一个帐单帐户及其客户编号,并带有一些“ ...” s代表其他值。

1 个答案:

答案 0 :(得分:0)

问题

这很可能是因为SAS有两种数据类型,并且第一次设置to变量时,它的值为customer_number。在第二个to语句中,您尝试将to的值设置为email_addr。假设email_addr是一个字符变量,那么这里可能发生两件事:

  • Customer_number是一个数字-to已设置为数字,因此SAS无法强制to成为字符,可能会出现如下错误:
  

注意:第15行第8列中的无效数字数据'me@mywebsite.com'to =。   错误 = 1 N = 1

  • 客户编号是一个字符-已将to设置为字符,但未明确定义其长度,如果它的长度小于email_addr的值,则电子邮件地址将被截断。如果发生这种情况,SAS将不会显示错误:

代码:

data _NULL_;
  to = 'hiya';
  to = 'me@mydomain.com';
  put to=;
run;

short=me@m

to的长度设置为4,SAS不会对其进行扩展以适应新数据。

详细信息

这里要记住的是SAS在后台如何工作。

  1. data语句设置输出位置
  2. set语句将第一次观察到的数据集指定的数据集添加到内存中称为PDV的空间中,从而继承了长度和数据类型。

PDV:

bill_account_number|customer_number|email_addr|e_customer_nm
===================================================================
010101             |            758|me@my.com |John Smith
  1. to语句添加了另一个变量,继承了customer_number的特征

PDV:

bill_account_number|customer_number|email_addr|e_customer_nm|to
===================================================================
010101             |            758|me@my.com |John Smith   |758

({to是字符长度3或数字)

  1. 后续to语句将不会更改变量的特征,并且SAS将继续处理

PDV(如果customer_number是character = TRUNCATION):

bill_account_number|customer_number|email_addr|e_customer_nm|to
===================================================================
010101             |            758|me@my.com |John Smith   |me@

PDV(如果customer_number是数字=数据错误,to设置为丢失):

bill_account_number|customer_number|email_addr|e_customer_nm|to
===================================================================
010101             |            758|me@my.com |John Smith   |.

解决方案

要解决此问题,最简单的方法是在第一个to语句之前设置to的长度和类型:

data analyze;
  set css_email_analysis;
  from = bill_account_number;
  length to $200;
  to = customer_number;
  output;
  ...

您可能会收到这样的消息,其中SAS代表您转换了数据:

  

注意:数字值已转换为字符         在以下位置给定的值:(Line):( Column)。         27:8

不必显式定义from的长度和类型,因为据我所知,您只能从源数据集中的一个变量获取此变量的值。如果不需要保留bill_account_number变量,也可以使用重命名来实现:

rename bill_account_number = from;