【问题标题】:Identifying the presence of specific factors across multiple categories of data table in R识别 R 中跨多个类别数据表的特定因素的存在
【发布时间】:2016-03-10 19:56:35
【问题描述】:

我正在使用 R 并尝试从导入的数据表的索赔行中确定具有特定诊断的患者。如果索赔中包含诊断代码,则使用同一数据表中新列中的指示符对它们进行分类。一个患者在一个索赔表中可以有许多诊断列 (>50)。

在这个特定示例中,我只显示了 6 个诊断列,并专门查找包含诊断代码“25000”或“25001”的索赔(对于某些疾病,如癌症,可能有数百个不同的诊断代码)。

示例声明文件

ID <- c(01, 02, 03, 04, 05, 06)
Dx1 <- c('25000', '25000', '91260', '87940', '81930', '79020')
Dx2 <- c('49600', '77760', '25000', '39320', '66020', '40100')
Dx3 <- c('41000', '49600', '65120', '65400', '40100', '88730')
Dx4 <- c('83500', '65940', '43100', '95210', '44000', '80390')
Dx5 <- c('58450', '25001', '81930', '35080', '49040', '40100')
Dx6 <- c('95260', '49600', '96460', "25000", '27910', '33720')
mydata <- data.frame(ID,Dx1,Dx2,Dx3,Dx4,Dx5,Dx6)

在声明中查找特定的诊断代码

mydata2 <- mydata[mydata$Dx1 %in% c('25000', "25001")
|  mydata$Dx2 %in% c('25000', "25001")
|  mydata$Dx3 %in% c('25000', "25001")
|  mydata$Dx4 %in% c('25000', "25001")
|  mydata$Dx5 %in% c('25000', "25001")
|  mydata$Dx6 %in% c('25000', "25001"), ]

创建新的指标列

mydata$Diab <- ifelse(mydata$ID %in% (mydata2$ID), 1, 0)

我使用多个“或”语句成功创建了一个指标,但是对于索赔数据表中的许多诊断列,这可能非常麻烦,我想知道是否有更简单的方法来代替使用重复的“或”声明?

【问题讨论】:

  • 我建议重塑您的数据和IDDxNvalue 列。那么做很多查询会容易得多。

标签: r loops apply


【解决方案1】:

我愿意:

library(data.table)
setDT(mydata)
mydata[ , Diab := apply(.SD, 1, function(x) any(x %in% c("25000","25001")))]

如果你真的想要integers 而不是logical,只需使用“骗子+”:

mydata[ , Diab := apply(.SD, 1, function(x) +any(x %in% c("25000","25001")))]

【讨论】:

  • 让我大吃一惊 - 我花了 15 分钟来创建问题,而您在 13 分钟内回答了!!非常感谢! - 如果我能问,你能详细说明一下“骗子+”吗?
  • @RobertWhite 你很快就会到那里的 :)
  • 这有点像 R 解释器的一个怪癖,如果你在一个逻辑向量前面加上 +,它会被解释为将你的向量添加到 0... 并反过来强制逻辑类型成整数。本质上它(或多或少)等同于as.integer,但更简洁。
  • 相当不错的“技巧” - 再次感谢您!!!! - 你刚刚从我的工作中减少了大约 3000 行代码!
  • @RobertWhite 还记得 jangorecki 所说的话。 apply 实际上相对较慢 - 如果您的数据是长格式,则可以使用更快的选项。
猜你喜欢
  • 2011-08-13
  • 1970-01-01
  • 1970-01-01
  • 2019-07-13
  • 1970-01-01
  • 2013-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多