各位學友中秋快樂,國慶節(jié)快樂,醫(yī)院的數(shù)據(jù)科學死氣沉沉,今天外院的朋友給了我一個 代碼,據(jù)說大語言模型的答案看不懂,我把它研究明白了,分享給大家 這段代碼的目的是根據(jù)相鄰時間區(qū)間的連續(xù)性,手動實現(xiàn)類似 iv_identify_group() 的功能,確定哪些時間區(qū)間是屬于同一組的,哪些是屬于不同組的。通過這種方式,代碼能夠標識出每個不連續(xù)的時間段。 具體功能解釋: 相鄰區(qū)間是否相連:通過 lag() 函數(shù)檢查上一個時間區(qū)間的結(jié)束時間(stoptime_seq_corr)是否小于當前時間區(qū)間的開始時間(starttime_seq_corr),從而判斷兩個時間段是否連續(xù)。如果不連續(xù),則認為是新的時間段。 標識新時間段:使用 ifelse() 和 cumsum() 來累計新時間段的數(shù)量并給出編號。 逐步解釋代碼: arrange(stay_id, starttime_seq_corr): 這一步先按 stay_id(患者的 ICU 停留 ID)和 starttime_seq_corr(矯正后的開始時間)進行排序,確保每個患者的所有時間區(qū)間按照時間順序排列。 group_by(stay_id): 按 stay_id 分組,意味著對于每個患者的 ICU 停留,我們將在其時間區(qū)間上進行獨立操作。 lag(stoptime_seq_corr): lag() 函數(shù)會返回前一行的 stoptime_seq_corr(結(jié)束時間)。通過 lag(),我們可以拿到上一個時間段的結(jié)束時間。 ifelse(is.na(lag(stoptime_seq_corr)) | lag(stoptime_seq_corr) < starttime_seq_corr, 1, 0): 這一行判斷當前時間段和前一個時間段是否相連: 如果是第一個時間段(lag() 返回 NA),它顯然是新的時間段,gap 設置為 1。 如果上一個時間段的結(jié)束時間 小于 當前時間段的開始時間,說明這兩個時間段不相連,gap 也設置為 1。 否則,兩個時間段相連,gap 設置為 0。 cumsum(gap): 使用 cumsum(gap) 來累計 gap 的值。每當 gap 為 1 時,累計和增加,這表示這是一個新的時間段。cumsum() 的結(jié)果就是給每個時間段分配了一個唯一的組編號。 ungroup(): 取消分組,返回一個沒有分組的完整數(shù)據(jù)框。 舉例說明: 假設 cort_pharm 的部分數(shù)據(jù)如下: r 復制代碼 cort_pharm <- tibble( stay_id = c(1, 1, 1, 1, 2, 2, 2), starttime_seq_corr = c(10, 15, 30, 50, 20, 40, 70), stoptime_seq_corr = c(14, 20, 35, 55, 25, 45, 75) ) 這個數(shù)據(jù)框的 stay_id 代表患者在 ICU 的住院標識,starttime_seq_corr 和 stoptime_seq_corr 是調(diào)整后的時間段的開始和結(jié)束時間?,F(xiàn)在我們想找到每個 stay_id 中相鄰時間區(qū)間是否相連,并給每個不連續(xù)的時間段分配一個編號。 執(zhí)行代碼后: r 復制代碼 cort_pharm <- cort_pharm %>% arrange(stay_id, starttime_seq_corr) %>% group_by(stay_id) %>% mutate( gap = ifelse(is.na(lag(stoptime_seq_corr)) | lag(stoptime_seq_corr) < starttime_seq_corr, 1, 0), cort_intervalno = cumsum(gap) ) %>% ungroup() print(cort_pharm) 輸出結(jié)果: r 復制代碼 # A tibble: 7 × 5 stay_id starttime_seq_corr stoptime_seq_corr gap cort_intervalno <dbl> <dbl> <dbl> <dbl> <dbl> 1 1 10 14 1 1 2 1 15 20 0 1 3 1 30 35 1 2 4 1 50 55 1 3 5 2 20 25 1 1 6 2 40 45 1 2 7 2 70 75 1 3 解釋輸出結(jié)果: 對于 stay_id = 1: 第一條記錄 starttime_seq_corr = 10,stoptime_seq_corr = 14,它是第一個時間段,gap 為 1,因此 cort_intervalno(區(qū)間編號)為 1。 第二條記錄的開始時間 15 是連續(xù)的,緊跟在前一條記錄的結(jié)束時間 14 之后,因此 gap 為 0,這仍然是同一個時間段,編號為 1。 第三條記錄 starttime_seq_corr = 30 與前一條不連續(xù)(前一個的結(jié)束時間是 20),因此 gap 為 1,這是一個新的時間段,編號為 2。 第四條記錄也是一個新的時間段,編號為 3。 對于 stay_id = 2: 類似地,三個不連續(xù)的時間段分別標記為 1、2 和 3。 總結(jié): gap = ifelse(...) 用來判斷相鄰時間段是否相連。如果相連,則 gap 為 0,否則 gap 為 1。 cumsum(gap) 累積 gap 值,用來給不連續(xù)的時間段分配唯一的編號,標識這些時間段是不同的時間區(qū)間。 |
|