Как поменять столбец в SAS по определенному идентификатору? - PullRequest
0 голосов
/ 27 июня 2019

У меня есть набор данных, который выглядит следующим образом

+----+------------+-------+
| ID | ID_Count   | Count |
+----+------------+-------+
|  1 |        1.1 |     5 |
|  1 |        1.2 |     4 |
|  1 |        1.3 |     3 |
|  2 |        2.1 |     4 |
|  2 |        2.2 |     2 |
|  3 |          3 |     0 |
|  4 |        4.1 |     5 |
|  4 |        4.2 |     3 |
+----+------------+-------+

Я хочу изменить группу в столбце Count, где ID такой же, как и предыдущий, но без обратного столбца ID.Мой результат должен выглядеть следующим образом:

+----+------------+-------+
| ID | ID_Count   | Count |
+----+------------+-------+
|  1 |        1.1 |     3 |
|  1 |        1.2 |     4 |
|  1 |        1.3 |     5 |
|  2 |        2.1 |     2 |
|  2 |        2.2 |     4 |
|  3 |          3 |     0 |
|  4 |        4.1 |     3 |
|  4 |        4.2 |     5 |
+----+------------+-------+

ID_Count - это просто столбец, показывающий, что порядок ID не должен изменяться.

Ответы [ 2 ]

1 голос
/ 27 июня 2019

, вероятно, есть более простой способ сделать это, но должно работать следующее:

Шаг 1: добавьте ROWNO в ваш первый набор данных:

data have_row;
retain ROWNO;
set have;
if _n_ = 1 then ROWNO = 0;
ROWNO = ROWNO + 1;
run;

Шаг 2 создайтезаказ, который вы ищете и добавить ROWNO:

proc sort data = have out = have_order;
by ID, Count;
run;

data have_order;
retain ROWNO;
set have_order;
if _n_ = 1 then ROWNO = 0;
ROWNO = ROWNO + 1;
run;

шаг 3 объединить данные:

proc sql noprint;
create want as
select a.id,b.id_count,a.count
from (select * from have_order)as a
left join
select * from have_row as b
on a.rowno=b.rowno;
quit;   
0 голосов
/ 28 июня 2019

Временный массив в виде стека является простым подходом.Вывод будет остановлен с ошибкой в ​​точке, где в группе больше строк, чем во временном массиве.В этом примере 10 000 слотов.

data have;
infile cards dlm='|';
input id id_count count;
datalines;
|  1 |        1.1 |     5 |
|  1 |        1.2 |     4 |
|  1 |        1.3 |     3 |
|  2 |        2.1 |     4 |
|  2 |        2.2 |     2 |
|  3 |          3 |     0 |
|  4 |        4.1 |     5 |
|  4 |        4.2 |     3 |
run;

* serial dows;

data want;
  array stack[10000] _temporary_;
  do _n_ = 1 by 1 until (last.id);
    set have;
    by id;
    stack[_n_] = count;
  end;
  do _n_ = _n_ to 1 by -1;
    set have;
    count = stack[_n_];
    output;
  end;
run;
...