反向过滤并计算多列中的多个数字
Reverse Filter and count multiple numbers over multiple columns
我有这样的数据集:
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)
但现在我想在新数据中找出显示了哪些其他外科手术编号(在多个列中)以及其中有多少。 IE。它不是空白的 NA,也不仅仅是我最初过滤的外科手术之一。
例如,我正在寻找的结果会显示,在这些 select 接受过 21356 and/or 21424 次手术的患者中,他们也有 ##### 和 ### ## 程序执行了一定次数,可能分布在多个列中。
任何帮助将不胜感激,谢谢。
这个怎么样?
library(tidyr)
NewData %>%
gather(key="typeofProcedure",
value = "procedureNr",
contains("Procedure")) %>%
filter(!is.na(procedureNr),
!procedureNr %in% NumbersIcareAbout) %>%
group_by(PatientNum,procedureNr) %>%
summarise(n = n())
希望对您有所帮助!!
首先,我们可以使用 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
在这种长格式中,很容易看出每个患者的哪些手术和哪些数字,因为它们都在一个列中,而不是分散在许多列中。
我有这样的数据集:
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)
但现在我想在新数据中找出显示了哪些其他外科手术编号(在多个列中)以及其中有多少。 IE。它不是空白的 NA,也不仅仅是我最初过滤的外科手术之一。
例如,我正在寻找的结果会显示,在这些 select 接受过 21356 and/or 21424 次手术的患者中,他们也有 ##### 和 ### ## 程序执行了一定次数,可能分布在多个列中。
任何帮助将不胜感激,谢谢。
这个怎么样?
library(tidyr)
NewData %>%
gather(key="typeofProcedure",
value = "procedureNr",
contains("Procedure")) %>%
filter(!is.na(procedureNr),
!procedureNr %in% NumbersIcareAbout) %>%
group_by(PatientNum,procedureNr) %>%
summarise(n = n())
希望对您有所帮助!!
首先,我们可以使用 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
在这种长格式中,很容易看出每个患者的哪些手术和哪些数字,因为它们都在一个列中,而不是分散在许多列中。