我正在尋找解決以下問題的 R 解決方案:
我有一個格式如下所示的疾病注冊表:
| 病人 | 診斷 | 診斷日期 1 | ... | 診斷日期 47 | ... | 診斷日期n |
|---|---|---|---|---|---|---|
| ID0001 | C18.9 - 結腸惡性腫瘤[提及的第一種疾病];疾病2; ...; 疾病 n | 2020-01-21 | ... | ... | ... | ... |
| .... | ... | ... | ... | ... | ... | ... |
| ID18000 | [...]; C18.9 - 結腸惡性腫瘤[在 95 個診斷中第 47 個提及];[...] | ... | ... | 2005-03-04 | ... | ... |
| ID18001 | C18.9 - 結腸惡性腫瘤 [ n 中提到的最后一個] | ... | ... | ... | ... | 2011-02-11 |
對于每一行(患者),有一列以分號分隔的疾病名稱和每個診斷的連續列格式。
我想從這個資料集中匯出一個用于特定診斷的二進制變數和帶有日期的附加列(例如“結腸癌”)。要做到這一點,現在必須知道疾病在診斷列中的位置(因為這將反映日期列的編號)。如圖所示,提到疾病的地方可能會有所不同,因此日期列因患者而異
我最初的想法是將 Diagnosis 列拆分為用分號分隔的列,但考慮到資料集的大小,這不是最佳選擇。
我想知道stringr 包中是否有任何可用的函式可以解決這個問題而無需進行列拆分?
謝謝你的幫助!
uj5u.com熱心網友回復:
希望我理解正確但繼承人我的解決方案使用 dplyr
df <- data.frame(Patient =c("ID0001","ID0002","ID0003"),Diagnosis=c("Disease1; Disease2; Disease3"),Date_of_diagnosis1=as.Date("2020-01-21"),Date_of_diagnosis2 = as.Date("2020-01-23"),Date_of_diagnosis3=as.Date("2015-12-01"))
df %>%
mutate(Diagnosis = strsplit(Diagnosis, ";")) %>%
unnest(Diagnosis)
輸出
Patient Diagnosis Date_of_diagnosis1 Date_of_diagnosis2 Date_of_diagnosi~
<chr> <chr> <date> <date> <date>
1 ID0001 "Disease1" 2020-01-21 2020-01-23 2015-12-01
2 ID0001 " Disease2" 2020-01-21 2020-01-23 2015-12-01
3 ID0001 " Disease3" 2020-01-21 2020-01-23 2015-12-01
4 ID0002 "Disease1" 2020-01-21 2020-01-23 2015-12-01
5 ID0002 " Disease2" 2020-01-21 2020-01-23 2015-12-01
6 ID0002 " Disease3" 2020-01-21 2020-01-23 2015-12-01
7 ID0003 "Disease1" 2020-01-21 2020-01-23 2015-12-01
8 ID0003 " Disease2" 2020-01-21 2020-01-23 2015-12-01
9 ID0003 " Disease3" 2020-01-21 2020-01-23 2015-12-01
uj5u.com熱心網友回復:
我建議您應該將您的資料從這種嵌入式寬格式轉換為更簡單的單診斷/每行日期長格式。
你的樣本資料不多,所以這里有一些假資料,我希望它有點代表性:
dat <- data.frame(
Patient = c("ID0001","ID18000","ID18001"),
Diagnosis = c("Disease1;Disease2;Disease3", "Disease2;Disease17", "Disease1;Disease4;Disease5"),
Date_of_diagnoses1 = c("2018-01-21", "2018-01-22", "2019-01-23"),
Date_of_diagnoses2 = c("2019-02-21", "2019-02-22", "2019-02-23"),
Date_of_diagnoses3 = c("2020-03-21", NA, "2020-03-23")
)
dat
# Patient Diagnosis Date_of_diagnoses1 Date_of_diagnoses2 Date_of_diagnoses3
# 1 ID0001 Disease1;Disease2;Disease3 2018-01-21 2019-02-21 2020-03-21
# 2 ID18000 Disease2;Disease17 2018-01-22 2019-02-22 <NA>
# 3 ID18001 Disease1;Disease4;Disease5 2019-01-23 2019-02-23 2020-03-23
使用 tidyverse:
library(dplyr)
library(stringr)
library(purrr) # pmap_chr
dat %>%
tidyr::pivot_longer(-c(Patient, Diagnosis), names_to = "Sequence", values_to = "Date") %>%
filter(!is.na(Date)) %>%
mutate(
Date = as.Date(Date),
Sequence = as.integer(str_extract(Sequence, "[0-9] $")),
Diagnosis = purrr::pmap_chr(list(strsplit(Diagnosis, ";", fixed = TRUE), Sequence), `[[`)
)
# # A tibble: 8 x 4
# Patient Diagnosis Sequence Date
# <chr> <chr> <int> <date>
# 1 ID0001 Disease1 1 2018-01-21
# 2 ID0001 Disease2 2 2019-02-21
# 3 ID0001 Disease3 3 2020-03-21
# 4 ID18000 Disease2 1 2018-01-22
# 5 ID18000 Disease17 2 2019-02-22
# 6 ID18001 Disease1 1 2019-01-23
# 7 ID18001 Disease4 2 2019-02-23
# 8 ID18001 Disease5 3 2020-03-23
關于資料的假設:
Date_of_diagnoses#欄位的數量始終是正確的,即,Date*列的數量始終與 中以 -;分隔的診斷一樣多Diagnosis;- 每個末尾的
Date數字正確計數,可以用作Diagnosis; 這不是一個嚴格的要求(不難解決),但我發現使用它很方便,并且更有保證我們總是使用Date正確的Diagnosis Diagnosis完美形成,沒有嵌入的分號會使提取變得模糊
一般來說,雖然這確實會延長您的資料(可能會顯著延長,具體取決于每位患者的診斷數量),但它也提供了更清晰的資料視圖(在我看來):更容易提取單個疾病的能力。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/321794.html
上一篇:索引除最后兩個值之外的所有值
下一篇:從字串中洗掉字符直到達到特定格式
