反向过滤并计算多列上的多个数字

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

我有这样的数据集:

PatientNum<- c(1, 2, 3, 4, 5,6,7)
Age<- c(10, 21, 51, 42, 35,99,25) 
SurgicalProcedureNumber <- c(21356, 21424, 221356, NA, 12345, 54321,NA) 
OtherSurgicalProcedureNumber   <- c(54321, NA, 21356, 12345, NA,12345, 21424) 
BloodLoss<-c(5,4,5,10,5,15,9)
YetAnotherSurgicalProcedureNumber<-c(11111,22222,NA, 33333,21356,555555,NA)

dataset <- data.frame(PatientNum, Age, SurgicalProcedureNumber, 
OtherSurgicalProcedureNumber, BloodLoss,YetAnotherSurgicalProcedureNumber)  

有一些我关心的外科手术,我想过滤:

NumbersIcareAbout<- c(21356,21424)

我过滤了多列上的数据,以便随时检测出我关心的数字之一。我将该结果保存为患者的新数据集。这样做是这样的:

NewData<-dataset %>%
  filter(SurgicalProcedureNumber %in% NumbersIcareAbout | 
       OtherSurgicalProcedureNumber %in% NumbersIcareAbout | 
       YetAnotherSurgicalProcedureNumber %in% NumbersIcareAbout)

但是现在我想在新数据中找出其他外科手术程序编号(多列中有多少)出现以及有多少。即它不是一个空白的NA,它不仅仅是我最初过滤的外科手术之一。

例如,我正在寻找的结果将显示在这些选择患者中已经完成了21356和/或21424,他们也进行了一定次数的#####和#####程序,其中可能分散在多个列上。

任何帮助将不胜感激,谢谢。

r dplyr medical
2个回答
1
投票

这个怎么样?

library(tidyr)
NewData %>% 
  gather(key="typeofProcedure",
         value = "procedureNr",
         contains("Procedure")) %>% 
  filter(!is.na(procedureNr),
         !procedureNr %in% NumbersIcareAbout) %>% 
  group_by(PatientNum,procedureNr) %>% 
  summarise(n = n())

希望能帮助到你!!


1
投票

首先,我们可以使用filter_at自动过滤多个列,而无需手动指定。然后我们将数据gather转换为长格式,每个过程都有一个单独的行。然后我们filter NA行和arrange易于阅读。

library(tidyverse)

df <- dataset %>%
    filter_at(vars(contains('SurgicalProcedureNumber')), any_vars(. %in% c(21356,21424)))%>%
    gather(key = procedure, value = proc_num,
           contains('SurgicalProcedureNumber')) %>%
    filter(!is.na(proc_num)) %>%
    arrange(PatientNum)
df

   PatientNum Age BloodLoss                         procedure proc_num
1           1  10         5           SurgicalProcedureNumber    21356
2           1  10         5      OtherSurgicalProcedureNumber    54321
3           1  10         5 YetAnotherSurgicalProcedureNumber    11111
4           2  21         4           SurgicalProcedureNumber    21424
5           2  21         4 YetAnotherSurgicalProcedureNumber    22222
6           3  51         5           SurgicalProcedureNumber   221356
7           3  51         5      OtherSurgicalProcedureNumber    21356
8           5  35         5           SurgicalProcedureNumber    12345
9           5  35         5 YetAnotherSurgicalProcedureNumber    21356
10          7  25         9      OtherSurgicalProcedureNumber    21424

在这种长格式中,很容易看出哪些程序对每​​个患者进行了哪些编号,因为它们都在一个列中,而不是分散在多个列中。

© www.soinside.com 2019 - 2024. All rights reserved.