Свертывание большого набора данных с условным сохранением некоторых пропущенных значений - PullRequest
0 голосов
/ 13 февраля 2019

Набор данных HAVE включает в себя id значения и символьную переменную names.Значения в names обычно отсутствуют.Если names отсутствует для всех значений id, КРОМЕ одного, поля для идентификаторов с пропущенными значениями в names могут быть удалены.Если names полностью отсутствует для всех id определенного значения (например, id = 2 или 5 ниже), одна запись для этого значения id должна быть сохранена.

Другими словами,Мне нужно превратить HAVE:

id  names
1
1
1   Matt, Lisa, Dan
1
2
2
2
3
3
3   Emily, Nate
3
4
4
4   Bob
5

в WANT:

id  names
1   Matt, Lisa, Dan
2
3   Emily, Nate
4   Bob
5

В настоящее время я делаю это, удаляя все записи, в которых отсутствует names, затем объединяя результатына новый набор данных KEY с одной переменной id, которая содержит все исходные значения (1, 2, 3, 4 и 5):

data WANT_pre;
set HAVE;
if names = " " then delete;
run;

data WANT;
merge KEY
      WANT_pre;
   by id;
run;

Это идеально подходит для HAVE, потому что я знаючто id - это набор числовых значений в диапазоне от 1 до 5. Но я менее уверен, как я мог бы сделать это эффективно (A) для файла гораздо большего размера и (B), если бы я не мог просто создать идентификаторKEY набор данных, считая от 1 до n.Если бы у ваших HAVE было несколько миллионов наблюдений, а ваши значения id были более сложными (например, шестнадцатеричные значения, такие как XR4GN), как бы вы получили WANT?

Ответы [ 4 ]

0 голосов
/ 13 февраля 2019

Используйте оператор UPDATE.Это будет игнорировать пропущенные значения и сохранит последнее не пропущенное значение.Обычно для этого требуется основной набор данных и набор данных транзакции, но вы можете использовать один и тот же набор данных для обоих.

data want;
  update have(obs=0) have ;
  by id;
run;
0 голосов
/ 13 февраля 2019

Здесь вы можете легко использовать SQL, MAX () применяется к символьным переменным в SQL.

proc sql; 
create table want as
select id, max(names) as names
from have
group by ID;
quit;

Другой вариант - использовать вместо него оператор UPDATE.

data want;
update have (obs=0) have;
by ID;
run;
0 голосов
/ 13 февраля 2019
proc summary data=have nway missing;
   class id;
   output out=want(drop=_:) idgroup(max(names) out(names)=);
   run;
0 голосов
/ 13 февраля 2019

Это кажется хорошим кандидатом для цикла DOW, если предположить, что ваш набор данных отсортирован по id:

data want;
do until(last.id);
  set have;
  by id;
  length t_names $50; /*Set this to at least the same length as names unless you want the default length of 200 from coalescec*/ 
  t_names = coalescec(t_names,names);
end;
names = t_names;
drop t_names;
run;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...