dplyr同时过滤多个列上的多个数字

时间:2018-04-13 18:04:23

标签: r dplyr

我有这样的数据集:

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

中显示这些数字的任何时候返回行

不知道怎么能在这里找不到它。

3 个答案:

答案 0 :(得分:3)

dplyr 1.0.4 版中,我们可以使用 filterif_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