0

我正在使用一个非常大的患者记录数据库。基本上我正在尝试根据某些诊断代码对患者进行分类。每个患者可能有 btw 1-10 诊断代码(DX1、DX2、DX3、DX4、DX5、DX6、DX7、DX8、DX9、DX10)。我很难使用多个条件进行编码以过滤每个 DX 列,因为它们可以采用不同的排列方式。

Example Dataset: 
DX1<-c("05", "89", "99", "87", "05", "67")
DX2<-c("87", "05", "21", "26", "23", "44","89", "13", "2" )
DX3<-c("04", "99","23", "05", "57", "16", "90", "89", "87")
DX4<-c("05", "26","21")
DX5<-c("67", "86","44", "63", "18", "87", "87", "05")
DX6<-c("75", "06","24", "02", "86", "15", "01", "87")
DX7<-c("86", "87","66", "56", "65", "05", "72")
install.packages("qpcR")                           
library("qpcR")
Patientdata <- qpcR:::cbind.na(DX1, DX2, DX3, DX4, DX5, DX6, DX7) 
data.frame(Patientdata)


   DX1 DX2 DX3  DX4  DX5  DX6  DX7
1   05  87  04   05   67   75   86
2   89  05  99   26   86   06   87
3   99  21  23   21   44   24   66
4   87  26  05 NA   63   02   56
5   05  23  57 NA   18   86   65
6   67  44  44 NA   87   15   05
7 NA  89  90 NA   87   01   72
8 NA  13  89 NA   05   87 NA
9 NA   2  87 NA NA NA NA

我想用 (05, or 5 or 02 or 2 or 62) AND (87 or 087 or 0086 or 089 or 89) 过滤所有有 DX 的患者

Patientdata<- Patientdata%>% mutate_at(vars(DX1, DX2, DX3, DX4, DX5, DX6, DX7),
Diagnosis= ifelse(. %in% c("05"| "5"| "02"| "2"| "36"| "62"|"0062") &
c("87"| "087"| "86"| "0086"| "89"| "089"), "Yes"))

我想要的是:

ID DX1 DX2 DX3 DX4 DX5 DX6 DX7 诊断
1 05 87 04 05 67 75 86 是的
2 89 05 99 26 86 06 87 是的
3 99 21 23 21 44 24 66
4 87 26 05 不适用 63 02 56 是的
5 05 23 57 不适用 18 86 65
6 67 44 46 不适用 87 15 05 是的
7 不适用 89 90 不适用 87 01 72
8 不适用 13 89 不适用 05 87 不适用 是的
9 不适用 2 87 不适用 不适用 不适用 不适用 是的

任何帮助深表感谢!

4

3 回答 3

2

这是一种tidyverse不添加诊断变量的方法:

rowAny <- function(x) rowSums(x) > 0

Patientdata %>% 
  mutate(ID = row_number()) %>% 
  filter(
    rowAny(
      across(
        starts_with("DX"), 
      ~ .x %in% c("05", "5", "02", "2", "36", "62","0062"), 
      .x %in% c("87", "087", "86", "0086", "89", "089")))) 

您在示例中有 ID,但在示例数据中没有,这就是在上面添加它的原因。

这给了我们:

   DX1 DX2 DX3  DX4  DX5  DX6  DX7 ID
1   05  87  04   05   67   75   86  1
2   89  05  99   26   86   06   87  2
3   87  26  05 <NA>   63   02   56  4
4   05  23  57 <NA>   18   86   65  5
5   67  44  16 <NA>   87   15   05  6
6 <NA>  13  89 <NA>   05   87 <NA>  8
7 <NA>   2  87 <NA> <NA> <NA> <NA>  9
于 2021-04-06T19:27:23.963 回答
1

更新

在阿克伦的帮助下。非常感谢。现在我得到了OP所需的解决方案。

Patientdata %>% 
  as_tibble %>% 
  rowwise () %>% 
  mutate(Diagnosis = if(any(c_across(starts_with("DX")) %in% vector)) "Yes" else "No") %>% 
  ungroup ()

输出:

# A tibble: 9 x 8
  DX1   DX2   DX3   DX4   DX5   DX6   DX7   Diagnosis
  <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr>    
1 05    87    04    05    67    75    86    Yes      
2 89    05    99    26    86    06    87    Yes      
3 99    21    23    21    44    24    66    No       
4 87    26    05    NA    63    02    56    Yes      
5 05    23    57    NA    18    86    65    Yes      
6 67    44    16    NA    87    15    05    Yes      
7 NA    89    90    NA    87    01    72    Yes      
8 NA    13    89    NA    05    87    NA    Yes      
9 NA    2     87    NA    NA    NA    NA    Yes

第一个解决方案 我不确定您是否需要这种解决方案。基本上创建您感兴趣的项目的矢量,然后across使用ifelse

library(tidyverse)

vector <- c("05", "5", "02", "2", "36", "62", "0062", "87", "087", "86", "0086", "89", "089")

Patientdata %>%
  as_tibble() %>% 
  mutate(Diagnosis = across(starts_with("DX"),
                            ~ ifelse(. %in% vector, "Yes", "No")))
# A tibble: 9 x 8
  DX1   DX2   DX3   DX4   DX5   DX6   DX7   Diagnosis$DX1 $DX2  $DX3  $DX4  $DX5  $DX6  $DX7 
  <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr>         <chr> <chr> <chr> <chr> <chr> <chr>
1 05    87    04    05    67    75    86    Yes           Yes   No    Yes   No    No    Yes  
2 89    05    99    26    86    06    87    Yes           Yes   No    No    Yes   No    Yes  
3 99    21    23    21    44    24    66    No            No    No    No    No    No    No   
4 87    26    05    NA    63    02    56    Yes           No    Yes   No    No    Yes   No   
5 05    23    57    NA    18    86    65    Yes           No    No    No    No    Yes   No   
6 67    44    16    NA    87    15    05    No            No    No    No    Yes   No    Yes  
7 NA    89    90    NA    87    01    72    No            Yes   No    No    Yes   No    No   
8 NA    13    89    NA    05    87    NA    No            No    Yes   No    Yes   Yes   No   
9 NA    2     87    NA    NA    NA    NA    No            Yes   Yes   No    No    No    No   
于 2021-04-06T19:35:45.613 回答
0

我尝试结合上面的两个代码,因为马特使用特定变量和变量组合。Akrun 和 Tajae 您的代码对二进制变量很有用,但没有检查变量的不同组合。另外我需要把它变成一个新列而不是小标题格式。感谢您的所有帮助,因为我是一名医生,只是想弄清楚这段代码。我在这里感谢大家的帮助

我尝试结合上述两个答案,但没有运气。

Patientdata %>% 
  rowwise () %>% 
  mutate(Diagnosis1 = filter(any(rowAny(c_across(
        starts_with("DX"), 
        ~ .x %in% c("05", "5", "02", "2", "36", "62","0062"), 
        .x %in% c("87", "087", "86", "0086", "89", "089")))) 

有什么解决办法吗?

于 2021-04-08T01:04:59.947 回答