【问题标题】:How to conditionally code a new variable based on checking multiple columns for multiple values如何根据检查多个列的多个值有条件地编码新变量
【发布时间】:2019-08-24 04:11:45
【问题描述】:

我想在一组变量 (DX1-DX5) 中搜索一系列值(ICD9 代码列表或 ICD10 代码列表),条件为 DXVER=9 搜索 ICD9 列表,DXVER=10 搜索 ICD10 列表。这可以手动写出来,但是因为变量和代码列表可能更长,我想通过按名称引用组来学习这样做。

我已经尝试过 if else 语句、rowsum 和编码每个单独的步骤。尽管我总是错过三个要求中的一步,但这些都可以工作。 1. 以 DXVER 为条件 2. DX1-DX5列表参考DXS 3.代码表参考ICD9和ICD10

ICD9 <- c('042', '7953', '79571', 'V08')
ICD10 <- c('888', 'a10', 'b10', '987')

DXS <- c(paste('DX', seq(1:5), sep = '')) 

MergedData<-data.frame(DXVER=c("9", "9", "0", "0", "9"),
                   DX1 = c('042',"1","1","2","1"),
                   DX2 = c("4","3",'2',"4","3"),
                   DX3 = c("2","2","4","2","2"),
                   DX4 = c("3",'101',"2","3","2"),
                   DX5 = c('79571',"3",'888',"2","2"),
                   ID  = c(345, 123, 246, 432, 121))

MergedData$HIV_claim<NA
MergedData$HIV_claim[MergedData$DX1 %in% ICD9 & MergedData$DXVER=="9"] <- 
1 
MergedData$HIV_claim[MergedData$DX2 %in% ICD9 & MergedData$DXVER=="9"] <- 
1 
MergedData$HIV_claim[MergedData$DX3 %in% ICD9 & MergedData$DXVER=="9"] <- 
1 
MergedData$HIV_claim[MergedData$DX4 %in% ICD9 & MergedData$DXVER=="9"] <- 
1 
MergedData$HIV_claim[MergedData$DX5 %in% ICD9 & MergedData$DXVER=="9"] <- 
1 

MergedData$HIV_claim[MergedData$DX1 %in% ICD10 & MergedData$DXVER=="0"] <- 
1 
MergedData$HIV_claim[MergedData$DX2 %in% ICD10 & MergedData$DXVER=="0"] <- 
1 
MergedData$HIV_claim[MergedData$DX3 %in% ICD10 & MergedData$DXVER=="0"] <- 
1    
MergedData$HIV_claim[MergedData$DX4 %in% ICD10 & MergedData$DXVER=="0"] <- 
1 
MergedData$HIV_claim[MergedData$DX5 %in% ICD10 & MergedData$DXVER=="0"] <- 
1 


 MergedData2 <- MergedData

 MergedData2$HIV_claim9<NA
MergedData2$HIV_claim10<NA
MergedData2$HIV_claim9 <-  ((rowSums(MergedData2[, DXS] == ICD9,  na.rm=T) 
> 0) * 1)
MergedData2$HIV_claim10 <- ((rowSums(MergedData2[, DXS] == ICD10, na.rm=T) 
> 0) * 1)

MergedData2$HIV_claim  <-  ifelse(MergedData2$DXVER == 9, 
ifelse(MergedData2$DX1 %in% ICD9 |  MergedData2$DX2 %in% ICD9
 |  MergedData2$DX3 %in% ICD9 |  MergedData2$DX4 %in% ICD9
|  MergedData2$DX5 %in% ICD9,1,0),0)

【问题讨论】:

  • 您的预期输出是什么?对于每个患者/ID,您是否尝试根据他们的 DX1-5 和 DXVER 确定他们的 HIV_claim 是否应该为 1(或 NA)?
  • 是的,您已经了解我的目标。如果在 DX1-DX5 中找到我要查找的代码,则 HIV_claim 为 1。

标签: r dataframe for-loop if-statement conditional-statements


【解决方案1】:
library(dplyr)

md %>% gather(dx,v,-DXVER,-ID) %>% 
  mutate(hiv = ifelse((v %in% ICD9 & DXVER=='9') | (v %in% ICD10 & DXVER=='0'),1,NA)) %>% 
  filter(hiv==1) %>% group_by(ID) %>% slice(1) %>% 
  select(ID,hiv) %>% left_join(md,.)

Joining, by = "ID"
  DXVER DX1 DX2 DX3 DX4   DX5  ID hiv
1     9 042   4   2   3 79571 345   1
2     9   1   3   2 101     3 123  NA
3     0   1   2   4   2   888 246   1
4     0   2   4   2   3     2 432  NA
5     9   1   3   2   2     2 121  NA

【讨论】:

  • 非常感谢@kstew 的解决方案。我没想到收集我的数据是长期的。你知道为什么第一行重复吗? ID 345 现在在上表中出现了两次。
  • 我想我意识到发生了什么。如果来自多个 DX1-DX5 的 hiv=1,例如第 1 行中的“042”和“79571”,则该行重复两次。发生这种情况时,我希望该行只出现一次。有没有办法为此调整代码?
  • 好收获。您可以添加 group_by()slice(1) 以按 ID 删除任何重复。我已经编辑了我的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-29
  • 1970-01-01
  • 2022-11-28
  • 2021-10-15
  • 2020-10-08
  • 1970-01-01
  • 2021-12-16
相关资源
最近更新 更多