【发布时间】:2021-12-03 23:06:05
【问题描述】:
我正在寻找以下问题的 R 解决方案:
我有一个格式如下所示的疾病注册表:
| Patient | Diagnosis | Date of diagnosis 1 | ... | Date of diagnosis 47 | ... | Dates of diagnosis n |
|---|---|---|---|---|---|---|
| ID0001 | C18.9 - Malignant neoplasm of colon [first disease mentioned]; Disease 2; ...; Disease n | 2020-01-21 | ... | ... | ... | ... |
| .... | ... | ... | ... | ... | ... | ... |
| ID18000 | [...]; C18.9 - Malignant neoplasm of colon [mentioned as 47th diagnosis out of 95]; [...] | ... | ... | 2005-03-04 | ... | ... |
| ID18001 | C18.9 - Malignant neoplasm of colon [the last of n mentioned] | ... | ... | ... | ... | 2011-02-11 |
每一行(患者)都有一列,其中以分号分隔的疾病名称和每个诊断的连续列格式。
我想从这个数据集中派生一个用于特定诊断的二进制变量和带有日期的附加列(例如“结肠癌”)。为此,现在必须在 Diagnosis 列中确定疾病的位置(因为这将反映 Date 列的编号)。 如图所示,提到疾病的地方可能会有所不同,因此带有日期的列会因患者而异
我最初的想法是用分号将诊断列分开,但考虑到数据集的大小,它不是最佳的。
我想知道 stringr 包中是否有任何功能可以解决这个问题而无需进行列拆分?
感谢您的帮助!
【问题讨论】:
-
为此我喜欢
tidyr::separate_rows。例如df %>% separate_rows(Diagnosis, sep = ";" -
如果您的问题中有更具代表性的数据会有所帮助。我相信那里的某个地方存在专有数据,这不是我们需要的……看起来很像您的数据但没有我们无法拥有的真实数据的东西。例如,
Diagnosis可能只是"Disease 1; Disease 2; Disease 3",而您有三个适用于它们的Date_of_diagnosis列。拥有至少那么多(最好是几行可能有不同数量的疾病)将非常有帮助。但我们只能猜测/假设。谢谢。 -
至于你喜欢不把它拆分出来......这当然是可行的,但是重复提取一两个东西在很大程度上效率低下。我建议您应该考虑将您的数据架构从当前的可变宽度(具有嵌入性)重塑为单个长格式框架(它没有嵌入分号分隔的字符串中)。从长远来看,它使许多事情变得容易得多。
-
亲爱的@r2evans 我已经修改了如上所示的示例。可能难以捕捉的重要细节是字符串中的特定诊断位置不是固定的,因为它是以随机顺序输入的。因此,患者之间的列数也会有所不同。