2012-03-19 2 views
2

У меня есть два набора данных, которые нужно объединить.few_to_many merge?

Первый большой набор данных с studyid и discharg (дата, когда пациенты получили их разряд).

Второе - меньшее количество наблюдений, чем первое. У них есть две колонки: studyid и call_mad (дата, когда медсестра вызова пациента после даты выписки). Не все разряды получают звонок от медсестры.

Первая таблица

STUDYID DISCHARG  

10011 2008-10-29   

10011 2008-11-7   

10011 2008-11-18   

10011 2009-10-17  

10011 2010-1-2  

10011 2010-1-22 

Вторая таблица

STUDYID  CALL_MAD 

10011   2009-10-19 
10011   2010-1-25 

Финальный стол Я хочу

STUDYID DISCHARG  CALL_MAD 

10011 2008-10-29   

10011 2008-11-7   

10011 2008-11-18   

10011 2009-10-17  2009-10-19 

10011 2010-1-2  

10011 2010-1-22  2010-1-25 

Надеюсь, это понятно. Заранее спасибо.

Джейн

+0

Можно ли разместить два набора данных отдельно ... – Teja

ответ

1

Я была такая же идея, как thelatemail, то есть вы сначала извлечь последнюю дату DISCHARG, которое < (или, возможно, < =) каждую дату CALL_MAD, затем объединить эти данные обратно к исходному набору данных. Я думаю, что это лучшее, что можно сделать с данными, структурированными так, как есть, хотя есть вероятность, что эта логика сломается (например, если вызов медсестры не связан с последней разрядкой). В идеале вы хотели бы добавить столбец даты DISCHARG ко второй таблице в качестве вторичного ключа, так что было бы легко присоединиться к дате STUDYID и DISCHARG без каких-либо предположений.

В любом случае, здесь код, который я использовал.

data ds1; 
input STUDYID DISCHARG :yymmdd10.; 
format DISCHARG yymmdd10.; 
datalines; 
10011 2008-10-29 
10011 2008-11-7 
10011 2008-11-18 
10011 2009-10-17 
10011 2010-1-2 
10011 2010-1-22 
; 
run; 

data ds2; 
input STUDYID CALL_MAD :yymmdd10.; 
format CALL_MAD yymmdd10.; 
datalines; 
10011 2009-10-19 
10011 2010-1-25 
; 
run; 

proc sql; 
create table ds3 as select 
ds1.*, 
ds2.call_mad 
from ds1 inner join ds2 on ds1.studyid=ds2.studyid and ds2.call_mad>ds1.discharg 
group by ds1.studyid,ds2.call_mad 
having ds1.discharg=max(ds1.discharg); 

create table want as select 
ds1.*, 
ds3.call_mad 
from ds1 left join ds3 on ds1.studyid=ds3.studyid and ds1.discharg=ds3.discharg; 
quit; 
+0

Ничего себе. Круто.Это очень полезно. Спасибо, Кейт. – user1238178

2

Я не проверял это много, но я думаю, что он должен работать нормально. Я не эксперт.

Предполагается, ваши два набора данных с именем 'первый' и 'второй':

/* set unique identifiers */ 
data first; 
    set first; 
    keyida = _N_; 
run; 

data second; 
    set second; 
    keyidb = _N_; 
run; 

Intermediate взгляд на данные:

Первый выглядит как:

study discharg keyida 
10011 10/29/2008 1 
10011 11/07/2008 2 
10011 11/18/2008 3 
10011 10/17/2009 4 
10011 01/02/2010 5 
10011 01/22/2010 6 

Второй выглядит например:

study discharg keyidb 
10011 10/19/2009 1 
10011 01/25/2010 2 

Теперь слейте и очистки:

/* merge the data on id and call made after discharge */ 
proc sql; 
    create table final as 
    select a.studyid, 
      a.discharg, 
      a.keyida, 
      b.studyid, 
      b.call_mad, 
      b.keyidb 
    from first a, 
      second b 
    where a.studyid = b.studyid and 
      b.call_mad > a.discharg 
    order by keyida; 
quit; 

/* remove duplicates of original dataset */ 
proc sort data=final nodupkey; 
    by keyida; 
run; 

/* sort by secondary id and date of calling */ 
proc sort data=final; 
    by call_mad 
     keyidb; 
run; 

/* remove duplicates of the secondary dataset */ 
data final (drop = keyida keyidb); 
    set final; 
    by call_mad 
     keyidb; 
    if not (last.call_mad and last.keyidb) then call_mad =.; 
run; 

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

study discharg call_mad 
10011 10/29/2008 . 
10011 11/07/2008 . 
10011 10/17/2009 10/19/2009 
10011 11/18/2008 . 
10011 01/02/2010 . 
10011 01/22/2010 01/25/2010 
+0

Большое спасибо. Узнайте много из вашего кода. Спасибо thelatemail. – user1238178

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