2016-08-10 2 views
1

Я использую SAS, и я пытаюсь прочитать значение наблюдения из предыдущего наблюдения в текущее наблюдение.SAS - считывание значения из одного наблюдения в другое наблюдение

вот что выглядит данные, как

Obs URN  Description Error_Bucket inputAcctNumber    count 
1 0100Base  Invalid Name AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1 
2 0100No 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. То, что я пытаюсь сделать, это дать всем этим наблюдениям тот же InputAcctNumber, который имеет тот же номер URN, но сейчас все они равны 0. Как я могу это сделать, особенно если количество «отсчетов» с урмой неоднозначно.

В идеале это то, что я хочу, чтобы мои данные, чтобы выглядеть следующим образом:

Obs URN  Description Error_Bucket inputAcctNumber    count 
1 0100Base  Invalid Name AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1 
2 0100No 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

Является ли запись с действительным AcctNumber всегда один с COUNT = 1? Возможно ли иметь более одной записи с действительным номером AcctNumber? Если это возможно, чтобы значения отличались друг от друга? Если так, какой из них вы хотите использовать? – Tom

+0

Номер заполненной учетной записи в каждой группе URN должен всегда быть графом 1. Может быть экземпляр, в котором учетные записи 2/3 имеют номер заполненной учетной записи и совместно используют номер URN – DukeLuke

+0

. Так что, если один URN может иметь два номера счета, то какой из них вы используете хотите использовать? Вы можете получить его до одного, используя только запись, в которой COUNT = 1. – Tom

ответ

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; 
+0

это даст ему любое количество наблюдений, где подсчет NE 1? – DukeLuke

+0

Он примет первое значение inputAcctNumber и скопирует его на все записи для этого значения URN. Так что да, он будет обрабатывать любое количество записей на URN (то есть любые значения COUNT). – Tom

+0

какая часть этого кода фактически создает Acct_numb во втором, третьем, n-м наблюдениях? Я вижу, если first.urn then new = acctnumb, но это будет удовлетворять только наблюдению, где count = 0, поскольку оно первое. Сохраняется ли новое утверждение, сохраняющее значение acctnumb от одной итерации урны к следующей? – DukeLuke

0

Я придумал способ сделать то, что вы просили, с помощью PROC SQL. Я делаю это, создавая 4 разных таблицы, причем последний из них - тот, который вы хотели. Это может быть не самый эффективный способ сделать это, но вы знаете свои данные лучше, чем я.

Код:

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; 

Выход с Proc печати набора данных 'е':

Obs URN Description Error_Bucket inputAcctNumber count 
1 100No Error No Error AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 2 
2 100Base Invalid Name AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1 
3 10001354321 No Error No Error DDDDDDDDDDDDDDDDDDDDDDDDDDDDDD 1 
4 10004567890 No Error No Error CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC 1 
5 10004567890 A2/J2 Invalid Name CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC 2 
6 10007891023 A2/J2 Invalid Name BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB 2 
7 10007891023 No Error No Error BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB 1 

Полное Объяснение:

(1) Я сделал таблицу строк с «количество 'равно 1. (2) Я сделал еще один стол, где «счет» не равен 1. (3) Затем я сделал внутреннее соединение таблицы, сделанной в (2), на том, что сделано в (1) с «inputAc ctNumber 'из таблицы, сделанной в (1), вместо таблицы, сделанной в (2). (4) Затем я приложил таблицу, сделанную в (3) к той, которая была сделана в (1), а затем отсортирована по «URN».

Надеюсь, это поможет.

+0

Я не вижу, какая часть кода присваивает значения числа номеров для обоих наблюдений, а не только «null» или 0 для него ... – DukeLuke

+0

Когда я создаю таблицу, d присваивает действительный номер входного_вопроса входному аргументу Input_cctNumber с отсутствующим значением на основе на внутреннем соединении согласования URN. –

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; 
+0

Я мог бы просто сортировать по URN, Count, Then Account Number, и это всегда должно работать, правильно? – DukeLuke

+0

Я просто изменил код, чтобы иметь дело с более чем двумя рядами на URN. Предполагая, что URN с допустимым номером inputAcctNumber предстает перед нулями, он показывает работу. Он работал над приведенными вами примерами. – david25272

Смежные вопросы