我有这样的数据集:
PatientNum<- c(1, 2, 3, 4, 5)
Age<- c(10, 21, 51, 42, 35)
SurgicalProcedureNumber <- c(21356, 21424, 221356, 12345, 54321)
OtherSurgicalProcedureNumber <- c(54321, 21356, 12345, 12345, 21424)
BloodLoss<-c(5,4,5,10,5)
YetAnotherSurgicalProcedureNumber<-c(11111,22222,33333,21356,555555)
dataset <- data.frame(PatientNum, Age, SurgicalProcedureNumber, OtherSurgicalProcedureNumber, BloodLoss,YetAnotherSurgicalProcedureNumber)
我想知道患者何时接受了某些手术:
NumbersIcareAbout<- c(21356,21424)
我知道我可以在一栏中找到它们:
dataset%>%filter(SurgicalProcedureNumber%in%NumbersIcareAbout)
这会返回患者1和2,因为它有这些代码......但我希望它能在SurgicalProcedureNumber,OtherSurgicalProcedureNumber或YetAnotherSurgicalProcedureNumber
中显示这些数字的任何时候返回行不知道怎么能在这里找不到它。
答案 0 :(得分:3)
在 dplyr
1.0.4 版中,我们可以使用 filter
和 if_any
library(dplyr)
dataset %>%
filter(if_any(ends_with("ProcedureNumber"), ~ . %in% NumbersIcareAbout))
答案 1 :(得分:1)
您可以像这样使用OR运算符|
:
dataset %>%
filter(SurgicalProcedureNumber %in% NumbersIcareAbout |
OtherSurgicalProcedureNumber %in% NumbersIcareAbout |
YetAnotherSurgicalProcedureNumber %in% NumbersIcareAbout)
# PatientNum Age SurgicalProcedureNumber OtherSurgicalProcedureNumber BloodLoss YetAnotherSurgicalProcedureNumber
# 1 1 10 21356 54321 5 11111
# 2 2 21 21424 21356 4 22222
# 3 4 42 12345 12345 10 21356
# 4 5 35 54321 21424 5 555555
我确定这是一种更优雅的方式,但这会过滤到2列或更多列中的匹配(我认为):
dataset %>%
filter((SurgicalProcedureNumber %in% NumbersIcareAbout +
OtherSurgicalProcedureNumber %in% NumbersIcareAbout +
YetAnotherSurgicalProcedureNumber %in% NumbersIcareAbout) >= 2)
# PatientNum Age SurgicalProcedureNumber OtherSurgicalProcedureNumber BloodLoss YetAnotherSurgicalProcedureNumber
# 1 2 21 21424 21356 4 22222
它的工作原理是使用%in%
将您的比较产生的逻辑向量相加。它依赖于TRUE + TRUE
给出2
的事实。因此,如果某行的值为2或更大,那么它就有多个匹配。
答案 2 :(得分:1)
另一个选项是使用dplyr::filter_at
,因为过滤条件应该应用于以ProcedureNumber
结尾的列。
library(dplyr)
dataset %>% filter_at(vars(ends_with("ProcedureNumber")),
any_vars(. %in% NumbersIcareAbout))
<强>结果强>
# PatientNum Age SurgicalProcedureNumber OtherSurgicalProcedureNumber BloodLoss YetAnotherSurgicalProcedureNumber
# 1 1 10 21356 54321 5 11111
# 2 2 21 21424 21356 4 22222
# 3 4 42 12345 12345 10 21356
# 4 5 35 54321 21424 5 555555