2013-10-17 22 views
0

我有2套。第一個是大的(約1000k行),它包含按觀察年份分組的患者觀察數據,可以說2000至2005年。在該組中,有一些患者包含所有年份的觀察結果(或者我應該說每個年),也有一些只有2002 - 2003年的觀測值。按順序擴展所有年份的觀察值

第二組只包含從2000年到2005年的6個年份的序列,6行。

我想擁有的是與來自集合1的數據爲每一個病人一個表,但是擴展以便爲每個患者我會看到每一年的觀察,從集2,如果有不對任何觀察在第1組中的特定年份,應該在數據只有中添加空行或空白(或更好的「 - 」)。

例如設置1可能是:

patient_id | obs_year | data 
a   2000  10 
a   2001  12 
a   2002  13 
a   2003  9 
a   2004  1 
a   2005  6 
bb   2002  100 
bb   2003  110 

集2是這樣的:

year | 
2000 
2001 
2002 
2003 
2004 
2005 

所以,我想在結果理想會是這樣的:

patient_id | obs_year | data 
a   2000  10 
a   2001  12 
a   2002  13 
a   2003  9 
a   2004  1 
a   2005  6 
bb   2000  - 
bb   2001  - 
bb   2002  100 
bb   2003  110 
bb   2004  - 
bb   2005  - 

我還應該提及我在SAS中完成這項工作,因此歡迎使用SQL查詢或SAS腳本(或兩者)解決方案。

+0

我們可以假設大表以任何方式排序嗎? (例如,按年份,按patient_id,按年份patient_id或按patient_id年份) – mvherweg

+0

是的,在對其應用任何代碼之前對其進行排序沒有問題,因此假定它被排序。 – Astro

回答

0

從第1組中刪除您的patient_id。將它合併到第2組中,以便爲每個patient_id提供這些年份,然後將它重新合併到patient_id和year的set 1中以提供您的輸出。無論是patient_id還是year不匹配的地方都會顯示爲空白,因爲在您所需的輸出中

+0

由於第2組與您在第1組中的患者數量相比非常小,因此散列合併效果會很好 – Zfunk

+0

似乎很好! – Astro

0

另一個選項是PROC FREQsparse,它會針對每種可能的組合生成一條線,無論它們是否出現。如果你的數據中沒有任何合法的零,這將起作用。如果你這樣做,並且關心他們與失蹤不同,這是行不通的。

proc freq data=have noprint; 
weight data; 
tables patient_id*obs_year/missing sparse out=want(rename=count=data keep=count patient_id obs_year); 
run; 

然後,如果您關心差異(大概在下一步,如果有的話),您需要將0轉換回丟失。

類似的方法更接近理想的結果是proc tabulateprintmiss,其工作方式類似於sparse

proc tabulate data=have out=want(keep=patient_id obs_year data_sum rename=data_sum=data); 
class patient_id obs_year; 
var data; 
tables patient_id,obs_year*data*sum='data'/printmiss misstext='.'; 
run; 

這實際上也讓你遺漏值正常。

相關問題