我使用的是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
答案 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;