2017-02-08 10 views
0

でレコードをマッチングするための最小の日付を検索:私はそうのような病院の出会いのデータセットを持っている別のデータフレーム

VISIT_KEY PAT_KEY DICT_ENC_TYPE_KEY  HOSP_DISCHRG_DT MED_ORD_ID HAD_FOLLOWUP 
1 82919395 8979499    83 2014-09-07 10:47:00 58826846   1 
2 82919395 8979499    83 2014-09-07 10:47:00 58826847   1 
3 82919395 8979499    83 2014-09-07 10:47:00 58826848   1 
4 82919395 8979499    83 2014-09-07 10:47:00 58826845   1 
5 77312433 8979499    83 2015-02-01 09:33:00 98525833   1 
6 77312433 8979499    83 2015-02-01 09:33:00 98525834   1 
7 77312433 8979499    83 2015-02-01 09:33:00 98525835   1 

などのようなフォローアップの出会いのデータセット:

VISIT_KEY PAT_KEY DICT_ENC_TYPE_KEY  APPT_CHECKIN_DT 
1 84273751 8979499    108 2015-02-07 11:57:46 
2 83999897 8979499    108 2014-09-13 16:51:22 
3 83881023 8979499    108 2014-11-12 10:37:51 
4 83999896 8979499    108 2014-11-20 09:23:25 
5 95164335 8979499    108 2016-07-27 15:30:25 
6 83922326 8979499    108 2014-11-16 09:08:47 

病院出会いデータセットの新しいフィールドに出会うためのAPP_CHECKIN_DTの最小値を取得しようとしています。FOLLOWUP_DTこれは、HOSP_DISCHRG_DTより大きい最小APP_CHECKIN_DTである必要があります。

例えば

:VISIT_KEY = 82919395について

  • 、この患者のための2014年9月7日10時47分00秒のHOSP_DISCHRG_DTよりも大きい第2のデータセットにおける最も早いAPP_CHECKIN_DTは2014から09であろう-13 16:51:22
  • VISIT_KEY = 77312433の場合、この患者のHOSP_DISCHRG_DTのHOSP_DISCHRG_DTより大きい最も古いAPP_CHECKIN_DTは2015-02-01 09:33:00です。 :57:46

最終的な病院の出会いデータセットは、以下のような:

VISIT_KEY PAT_KEY DICT_ENC_TYPE_KEY  HOSP_DISCHRG_DT MED_ORD_ID HAD_FOLLOWUP   FOLLOWUP_DT 
1 82919395 8979499    83 2014-09-07 10:47:00 58826846   1 2014-09-13 16:51:22 
2 82919395 8979499    83 2014-09-07 10:47:00 58826847   1 2014-09-13 16:51:22 
3 82919395 8979499    83 2014-09-07 10:47:00 58826848   1 2014-09-13 16:51:22 
4 82919395 8979499    83 2014-09-07 10:47:00 58826845   1 2014-09-13 16:51:22 
5 77312433 8979499    83 2015-02-01 09:33:00 98525833   1 2015-02-07 11:57:46 
6 77312433 8979499    83 2015-02-01 09:33:00 98525834   1 2015-02-07 11:57:46 
7 77312433 8979499    83 2015-02-01 09:33:00 98525835   1 2015-02-07 11:57:46 

私は病院の出会いのPAT_KEYは、外来患者遭遇PAT_KEYと一致しAPPT_CHECKIN_DTがあるならば、APPT_CHECKIN_DT参照を取得、出会いがフォローしていたかどうかを確認見つけるために以下のようなifelse文とループのためのいくつかを試してみましたHOSP_DISCHRG_DTより大きく、その後、フォローの日付を取得するために最低限APPT_CHECKIN_DTを取る:

for (i in 1:nrow(children_dx)) { 
    children_dx$FOLLOW_UP_DATE[i] <- 
    ifelse(children_dx$HAD_FOLLOWUP[i] == 1, 
      ifelse(outpatient_visits$APPT_CHECKIN_DT[children_dx$PAT_KEY[i] == outpatient_visits$PAT_KEY] > children_dx$HOSP_DISCHRG_DT[i], 
        as.character(min(outpatient_visits$APPT_CHECKIN_DT[children_dx$PAT_KEY[i] == outpatient_visits$PAT_KEY])), 
        NA),NA) 
}  

しかし、これは完全なデータセットの実行に非常に時間がかかり、完成した場合でも、FOLLOWUP_DATEはのための全体的な最小値でありますPAT_KEYが一致するレコードだけでなく、データセット全体のAPPT_CHECKIN_DT。

答えて

1

を使用して解決する方が簡単かつ迅速で、その後元DFのmergeで、その後mergeとサブセットaggregateを考えてみましょう:

データ

setClass('myDate') 
setAs('character', 'myDate', function(from) as.POSIXct(from, format='%Y-%m-%d %H:%M:%S')) 

hospital_encounters <- read.table(text=" 
      VISIT_KEY PAT_KEY DICT_ENC_TYPE_KEY  HOSP_DISCHRG_DT MED_ORD_ID HAD_FOLLOWUP 
      1 82919395 8979499    83 '2014-09-07 10:47:00' 58826846   1 
      2 82919395 8979499    83 '2014-09-07 10:47:00' 58826847   1 
      3 82919395 8979499    83 '2014-09-07 10:47:00' 58826848   1 
      4 82919395 8979499    83 '2014-09-07 10:47:00' 58826845   1 
      5 77312433 8979499    83 '2015-02-01 09:33:00' 98525833   1 
      6 77312433 8979499    83 '2015-02-01 09:33:00' 98525834   1 
      7 77312433 8979499    83 '2015-02-01 09:33:00' 98525835   1", 
      header=TRUE, colClasses = c('numeric', 'numeric', 'numeric', 'numeric', 'myDate', 'numeric', 'numeric'), 
      stringsAsFactors = FALSE)  

follow_up_encounters <- read.table(text=" VISIT_KEY PAT_KEY DICT_ENC_TYPE_KEY  APPT_CHECKIN_DT 
      1 84273751 8979499    108 '2015-02-07 11:57:46' 
      2 83999897 8979499    108 '2014-09-13 16:51:22' 
      3 83881023 8979499    108 '2014-11-12 10:37:51' 
      4 83999896 8979499    108 '2014-11-20 09:23:25' 
      5 95164335 8979499    108 '2016-07-27 15:30:25' 
      6 83922326 8979499    108 '2014-11-16 09:08:47'", 
      header=TRUE, colClasses = c('numeric', 'numeric', 'numeric', 'numeric', 'myDate'), 
      stringsAsFactors = FALSE) 

プロセス

mdf <- subset(merge(hospital_encounters, follow_up_encounters[c("PAT_KEY", "APPT_CHECKIN_DT")], 
       by=c("PAT_KEY")), APPT_CHECKIN_DT > HOSP_DISCHRG_DT) 

aggdf <- setNames(aggregate(APPT_CHECKIN_DT~ PAT_KEY + VISIT_KEY, mdf, FUN=min), 
        c("PAT_KEY", "VISIT_KEY", "FOLLOWUP_DT")) 

hospital_encounters <- merge(hospital_encounters, aggdf, c("PAT_KEY", "VISIT_KEY")) 

出力

hospital_encounters 

# PAT_KEY VISIT_KEY DICT_ENC_TYPE_KEY  HOSP_DISCHRG_DT MED_ORD_ID HAD_FOLLOWUP   FOLLOWUP_DT 
# 1 8979499 77312433    83 2015-02-01 09:33:00 98525833   1 2015-02-07 11:57:46 
# 2 8979499 77312433    83 2015-02-01 09:33:00 98525834   1 2015-02-07 11:57:46 
# 3 8979499 77312433    83 2015-02-01 09:33:00 98525835   1 2015-02-07 11:57:46 
# 4 8979499 82919395    83 2014-09-07 10:47:00 58826846   1 2014-09-13 16:51:22 
# 5 8979499 82919395    83 2014-09-07 10:47:00 58826847   1 2014-09-13 16:51:22 
# 6 8979499 82919395    83 2014-09-07 10:47:00 58826848   1 2014-09-13 16:51:22 
# 7 8979499 82919395    83 2014-09-07 10:47:00 58826845   1 2014-09-13 16:51:22 
+0

これは、その作業のように見えますが、私はこのエラーrecieveing保つ:min.defaultで 'エラー(C(1420043124、1420043124、1420043124 、1420043124、: 最小値を取得しようとすると、引数の 'タイプ'(リスト)が無効です – nimz713

+1

実際のデータフレームには、実際の日付、文字、 POSIXct型に変換してみてください。このソリューションとコードでデータサンプルを実行すると、ソリューションの動作がわかります。 – Parfait

0

この質問はおそらくdata.table

library(data.table) 

#read in the data, convert to data.table using setDT, convert the datetime column into POSIX format, set up a joining key 
dt1 <- setDT(read.table(text="VISIT_KEY PAT_KEY DICT_ENC_TYPE_KEY  HOSP_DISCHRG_DT MED_ORD_ID HAD_FOLLOWUP 
82919395 8979499    83 '2014-09-07 10:47:00' 58826846   1 
82919395 8979499    83 '2014-09-07 10:47:00' 58826847   1 
82919395 8979499    83 '2014-09-07 10:47:00' 58826848   1 
82919395 8979499    83 '2014-09-07 10:47:00' 58826845   1 
77312433 8979499    83 '2015-02-01 09:33:00' 98525833   1 
77312433 8979499    83 '2015-02-01 09:33:00' 98525834   1 
77312433 8979499    83 '2015-02-01 09:33:00' 98525835   1", header=TRUE))[, 
    HOSP_DISCHRG_DT:=strptime(HOSP_DISCHRG_DT, format="%Y-%m-%d %H:%M:%S")][, 
     KEY_DATE:=HOSP_DISCHRG_DT] 

dt2 <- setDT(read.table(text="VISIT_KEY PAT_KEY DICT_ENC_TYPE_KEY APPT_CHECKIN_DT 
84273751 8979499    108 '2015-02-07 11:57:46' 
83999897 8979499    108 '2014-09-13 16:51:22' 
83881023 8979499    108 '2014-11-12 10:37:51' 
83999896 8979499    108 '2014-11-20 09:23:25' 
95164335 8979499    108 '2016-07-27 15:30:25' 
83922326 8979499    108 '2014-11-16 09:08:47'", header=TRUE))[, 
    APPT_CHECKIN_DT:=strptime(APPT_CHECKIN_DT, format="%Y-%m-%d %H:%M:%S")][, 
     list(APPT_CHECKIN_DT, KEY_DATE=APPT_CHECKIN_DT)] 

#do check out ?data.table to understand the meaning of roll 
dt2[dt1, on="KEY_DATE", roll=-Inf][, 
    KEY_DATE:=NULL] #remove the joining key 
関連する問題