Заменить значение строки предыдущим по группе в SAS - PullRequest
0 голосов
/ 07 апреля 2020

enter image description here

Есть ли способ заменить значение строки на предыдущую строку каждой группой? Ниже приведен набор данных до и после. Продукт для каждого типа - C необходимо изменить как тип - L для каждого клиента, если идентификатор совпадает, у него наибольшее количество.

До

ObsCust LINK_ID Type Product    Amount
1   1   12432   L    A         23
2   1   12432   C    B         0
3   2   23213   L    C         234
4   2   23145   L    D         25
5   2   23145   C    E         0
6   3   21311   L    F        34
7   3   21324   L    G        45
8   3   21324   L    H        35
9   3   21324   C    I        0

После

Cust LINK_ID Type   Product           Amount
1   12432    L       A                 234
1   12432    C       A                    -  
2   23213    L       C               23,212
2   23145    L       D                 335
2   23145    C       D                    -  
3   21311    L       F                 323
3   21324    L       G                2,344
3   21324    L       H                   34
3   21324    C       G                    -  

Спасибо!

Ответы [ 2 ]

1 голос
/ 08 апреля 2020

если я правильно понимаю, вы хотите, чтобы значение продукта составляло C Тип - это продукт, связанный с наибольшим количеством в типах L. Если это правильно, одним из возможных способов является использование следующего. Сначала продукт с наибольшим количеством для L-типа в каждой группе клиентов и идентификаторов рассчитывается следующим образом: обратите внимание, что исходный набор данных предполагается с именем «пример».

proc sql;
create table L_Type as
select cust, LINK_ID, product, amount
from example
where type = 'L' and amount = max(amount)
group by cust, LINK_ID 
;
quit;

, затем продукт, рассчитанный выше в исходном примере кодируется для типа c.

proc sql;
select 
    e.cust
   , e.LINK_ID
   , e.type 
   , case when e.type = 'C' then b.product end as product
   , e.amount
from example e left join L_Type b
on e.cust = b.cust and e.LINK_ID = b.LINK_ID
;
quit;
0 голосов
/ 07 апреля 2020

Итак, у вас есть пара задач обработки:

Рассмотрены ли все крайние случаи?

  • Для клиента найдите строку (и) с помощью максимальная сумма.

    • Является ли один из них типом L?
    • Нет, ничего не делать
    • Да, отслеживать Product и LinkId следующим образом

      • Есть ли более одной «максимальной» строки?
      • Нет, отслеживать Product & LinkId из одной строки
      • Да, в строках более одного Product ?
        • Нет, отслеживать значение продукта
        • Существует ли более одного LinkId?
          • Нет, отслеживать LinkId
          • Да, какие LinkIds?
          • Отслеживание всех разных LinkIds
          • Отслеживание одного из них: первый, самый низкий, самый высокий, последний LinkId
        • Да, что теперь?
        • Зарегистрировать ошибку?
        • Отслеживать один значений Прибора, потому что можно использовать только один, какой?
          • первое появление?
          • самое низкое значение?
          • самое высокое значение?
          • последнее появление?
    • Для отслеживаемых LinkIds (их может не быть) примените отслеживаемый продукт к строкам типа C (или, возможно, типа не L)

...