開始終了日の情報から持続期間をまとめる話

まあ,医薬なら有害事象の持続とか,薬剤の継続使用を特定のカテゴリでまとめて
切れ間なく続いていた期間をまとめたレコードを合成するってことはあるのですが

これが結構SASだとやりにくい.SQLでもやれるんだけど,レコード一時的にかさむから
環境のパワーないとちょっと辛い時がある

なので結局,ハッシュオブジェクトを使ってしまう


👆適当なサンプルですが,症例ごとにカテゴリで,切れ間なく持続してる期間でまとめて
レコードをおこす
data wk1;
length ID cat term $30.;
format st en yymmdd10.;
ID="001";cat="痛み";term="頭痛";st="01JAN2025"d;en="05JAN2025"d;output;
ID="001";cat="痛み";term="筋肉痛";st="06JAN2025"d;en="10JAN2025"d;output;
ID="001";cat="痛み";term="関節痛";st="12JAN2025"d;en="13JAN2025"d;output;
ID="001";cat="痛み";term="神経痛";st="14JAN2025"d;en="19JAN2025"d;output;
ID="001";cat="胃腸障害";term="胃痛";st="01JAN2025"d;en="08JAN2025"d;output;
ID="001";cat="胃腸障害";term="腸炎";st="06JAN2025"d;en="12JAN2025"d;output;
ID="002";cat="感染症";term="インフルエンザ";st="02JAN2025"d;en="08JAN2025"d;output;
ID="002";cat="感染症";term="感冒";st="01JAN2025"d;en="10JAN2025"d;output;
run;










ここで,setしつつ,setしたもの自体をハッシュオブジェクトにマルチキー許容でいれて
自症例の全検索をかけちゃいます.ハッシュオブジェクトはメモリ内走査なので,特にアルゴリズム工夫なく力技で十分いけます

proc sort data=wk1;
by ID cat st en;
run;

data wk2;
length ID cat $30. cat_st cat_en 8.;
format cat_st cat_en yymmdd10.;
set wk1;
if 0 then set wk1(rename=(st=_st en=_en));
if _N_ = 1 then do;
  declare hash h1(dataset:"wk1(rename=(st=_st en=_en))",multidata:"Y");
  h1.definekey("ID","cat");
  h1.definedata("_st","_en");
  h1.definedone();
end;
cat_st = st;
cat_en = en;
do while(h1.do_over() = 0);
if n(_st,_en) = 2 then do;
  if _st-1<=cat_en<=_en and cat_en <= _en then do;
cat_en = _en;
if _st < cat_st then cat_st = _st; 
  end;
end;
end;
keep ID cat cat_st cat_en;
run;




do_overメソッドはキーがヒットする限り0を返し続けハッシュオブジェクトの中を探しつづけます.なのでdo whileと相性がいいですね.
そのままだと,元レコード数と変わらず集約されてないので,一番包括的なものだけを残します
 
proc sort data=wk2 ;
by ID cat  cat_en cat_st;
run;
 
data wk3;
set wk2;
by ID cat  cat_en cat_st;
if first.cat_en;
run;




どうでしょう?そんな 難しくないと感じるのではないでしょうか






0 件のコメント:

コメントを投稿