我有一个入草问题,一直没有找到类似的问题,自己也没有弄明白。根据以往的经验,总会有解决的办法,但我找了很多环形问题和潜在的purrr图问题,就是没有找到。
我是做健康数据研究的。我有一个独特的ICD代码的主列表,用于对病人的诊断进行分类,从开始到结束--有成千上万的代码。我想把定义特定条件的变量添加到该数据框架上,这些变量是我从数据集中分离出来的。例如,在主数据框架中,我有太阳底下的所有诊断,并且我有一个术语糖尿病的集合定义。我希望能够循环浏览存储为值的多个集合术语定义(糖尿病、心力衰竭、肾脏疾病等),然后在我的主列表数据框架中创建一个新列,其中1代表定义的一部分,0代表不属于定义的一部分。问题是我有几百个定义的条件和几千个潜在的代码,这意味着我当然需要以编程的方式来做这件事(特别是如果我需要调整添加一个术语定义和重新定义)。
到目前为止,我已经尝试了下面的方法。
library(dplyr)
terms <- c('acute_kidney_failure', 'acute_limb_ischemia')
for(i in terms){
definitions_master.df <- ontology_master.df %>%
mutate(i = if_else(ONTOLOGY_CODE %in% i, 1, 0))
}
我故意把它简单化,但有很多术语。这些术语的存储值如急性肾衰竭<- c(1,2,3),急性肢体缺血<- c(4,5,6)。理想情况下,新列的名称与数据框架中的术语相同,因为我希望能够识别诊断,如果可以帮助的话,我不想经历重命名数百个术语的麻烦。
我读过很多讨厌for循环的说法,我绝不是被束缚住了,但这是我唯一能想到的办法。最后我希望能够引用这个主定义表在特定的数据集中创建变量,我会反复使用它。我是为了长远的发展,所以我希望能以编程的方式,优雅地,可重复地完成这个任务。我愿意学习任何必要的新包或函数,但如果可以的话,我喜欢呆在整洁的verse中,因为它不太可能硬性破坏我的代码。有谁能帮助我吗?
EDIT
下面是最小可复制的例子。好抱歉,我花了一段时间才完成这个学期的工作。
医疗条件定义如下--我有这些......还有很多。
library(dplyr)
acute_kidney_failure <- c('1', '3', '5')
acute_limb_ischemia <- c('2', '6', '8')
整体的主数据框架就像下面这个。识别码是所有识别医疗条件的代码的主列表,比如上面的1、3、5;2、6、8。
definitions.df <- data.frame(identifying_code = c(1:10))
我不想用下面的变量创建,而是想用某种循环或映射函数来扫描定义,查看 "识别码 "变量,然后创建一个新的列,结果是下面的数据框架。我特别希望它是程序化的,因为我们一直在添加新的定义,我希望能够添加一个新的定义,再运行一次,就能生成新的列,而不会有太多的麻烦。如果我必须重新创建整个定义数据框架也没有关系,因为它只是一个函数。这是一个简单的例子,但在规模上,这将是不可能手工完成的。
definitions.df <- definitions.df %>%
mutate(acute_kidney_failure = c(1, 0, 1, 0, 1, 0, 0, 0, 0, 0)) %>%
mutate(acute_limb_ischemia = c(0, 1, 0, 0, 0, 1, 0, 1, 0, 0))
我已经尝试了我之前提到的循环,但没有能力让它运行。有人有什么想法吗?
假设这些术语是你使用的向量的名称,你可以做如下操作。
如你所追求的,你可以用 %in%
来查看诊断是否包含在给定的向量中。通过使用 get
你访问的对象(在这个例子中是一个向量)的名称与字符串的名称相同。terms
.
这将返回 TRUE
或 FALSE
是否包含在向量中。如果要转换为1或0,请加上加号。+
符号。
结果被分配到一个新的列中,其名称与字符串在 terms
.
for (i in terms) {
definitions.df[[i]] <- (+(definitions.df$identifying_code %in% get(i)))
}
可能有其他的方法来考虑组织你的诊断和数据。让我知道任何问题或如果我可以进一步帮助。
輸出
identifying_code acute_kidney_failure acute_limb_ischemia
1 1 1 0
2 2 0 1
3 3 1 0
4 4 0 0
5 5 1 0
6 6 0 1
7 7 0 0
8 8 0 1
9 9 0 0
10 10 0 0