SAS - 从一个观察到另一个观察的阅读价值

时间:2016-08-10 15:49:09

标签: macros sas

我使用的是SAS,我试图将先前观察中的观察值读入当前观察中。

这里的数据是什么

Obs URN       Description Error_Bucket inputAcctNumber             count 
1 010001234567 Base      Invalid Name  AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1 
2 010001234567 No Error  No Error          0                          2 
3 010007891023 No Error  No Error      BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB 1 
4 010007891023 A2/J2     Invalid Name      0                          2 
5 010004567890 No Error  No Error      CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC 1 
6 010004567890 A2/J2     Invalid Name      0                          2 
7 010001354321 No Error  No Error      DDDDDDDDDDDDDDDDDDDDDDDDDDDDDD 1 

我已经创建了Count字段,在这个例子中,只有两个具有相同URN的观测值,但是将来可能会有3-N个具有相同URN值的观测值。我尝试做的是给所有这些观察结果相同的具有相同URN编号的InputAcctNumber,但现在它们都是0' s。我怎么能这样做,特别是如果"计数"与瓮是不明确的。

理想情况下,这就是我想要的数据:

    Obs URN       Description Error_Bucket inputAcctNumber             count 
1 010001234567 Base      Invalid Name  AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1 
2 010001234567 No Error  No Error      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 2 
3 010007891023 No Error  No Error      BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB 1 
4 010007891023 A2/J2     Invalid Name  BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB 2 
5 010004567890 No Error  No Error      CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC 1 
6 010004567890 A2/J2     Invalid Name  CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC 2 
7 010001354321 No Error  No Error      DDDDDDDDDDDDDDDDDDDDDDDDDDDDDD 1 

3 个答案:

答案 0 :(得分:2)

一种简单的方法就是将inputAcctNumber变量合并回数据。

data want ;
  merge have (drop=inputAcctNumber )
        have (keep=URN inputAcctNumber where=(inputAcctNumber ne '0'))
  ;
  by URN;
run;

如果第一条记录的编号总是正确,那么您可以创建一个新变量并保留该值。

data want;
  set have ;
  by urn count ;
  if first.urn then new=inputAcctNumber;
  retain new;
  drop inputAcctNumber;
  rename new=inputAcctNumber;
run;

答案 1 :(得分:0)

我已经想出了一种方法来使用PROC SQL做你所要求的。我这样做是通过创建4个不同的表,最后一个是你想要的表。这可能不是您执行此操作的最有效方式,但您比我更了解您的数据。

代码:

from sqlalchemy.sql import text
with engine.connect() as con:
    statement = text("""your function""")
    con.execute(statement)

使用数据集的proc打印输出' e':

proc sql noprint; 
  create table b as 
    select * 
      from a
        where count eq 1;

  create table c as
    select * 
      from a 
        where count ne 1;

  create table d as
    select c.URN, c.Description, c.Error_Bucket, b.inputAcctNumber, c.count
      from b b inner join c c
        on b.urn=c.URN
          order by URN;

  create table e as
    select * 
      from b
      outer union corresponding
    select *
      from c
        order by URN; 
quit;

完整说明:

(1)我制作了一张带有' count'等于1。 (2)我做了另一张表,其中包括' count'不等于1。 (3)然后,我将(2)中制作的表格与(1)中的表格进行内部连接,并输入' inputAcctNumber'从(1)中制成的表而不是(2)中制成的表。 (4)然后我将(3)中的表格附加到(1)中制作的表格中,然后按“URN'”进行分类。

希望这很有帮助。

答案 2 :(得分:0)

您可以使用retain语句让SAS在datastep中保留以前的记录值。

假设可以对数据进行排序,以便首先出现有效inputAcctNumber的记录,您可以使用以下代码:

proc sort; by URN count;

data test_output (drop=replacement);
 length replacement $50;
 retain replacement;
 set test_input;
 if trim(inputAcctNumber) = '0' then inputAcctNumber=replacement;
 output;
 if trim(inputAcctNumber) ne '0' then replacement=inputAcctNumber;
run;