对于LoopPurrr Map函数,根据R中的存储值创建新变量。

问题描述 投票:0回答:1

我有一个入草问题,一直没有找到类似的问题,自己也没有弄明白。根据以往的经验,总会有解决的办法,但我找了很多环形问题和潜在的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))

我已经尝试了我之前提到的循环,但没有能力让它运行。有人有什么想法吗?

r for-loop purrr
1个回答
1
投票

假设这些术语是你使用的向量的名称,你可以做如下操作。

如你所追求的,你可以用 %in% 来查看诊断是否包含在给定的向量中。通过使用 get 你访问的对象(在这个例子中是一个向量)的名称与字符串的名称相同。terms.

这将返回 TRUEFALSE 是否包含在向量中。如果要转换为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
© www.soinside.com 2019 - 2024. All rights reserved.