首页 > 解决方案 > 如何在R中使用逻辑向量

问题描述

3名医生诊断一名患者

问题1:如何筛选所有3位医生诊断为疾病B的患者(无论是B.1、B.2还是B.3)

问题2:如何筛选3位医生中任何一位诊断为疾病A的患者。

set.seed(20200107)
df <- data.frame(id = rep(1:5,each =3),
                 disease = sample(c('A','B'), 15, replace = T))
df$disease <-  as.character(df$disease)
df[1,2] <- 'A'
df[4,2] <- 'B.1'
df[5,2] <- 'B.2'
df[6,2] <- 'B.3'·
df

我有一个方法,但我不知道如何编写代码。我认为应该在代码any()all()函数中使用。

首先,我想按 id 对患者进行分组。

其次,检查每组中的所有疾病是A还是B。

像这样的代码

df %>% group_by(id) %>% filter_all(all_vars(disease == B))

标签: rfilterdplyr

解决方案


您可以all假设每位患者仅由 3 位医生检查。

library(dplyr)
df %>% group_by(id) %>% summarise(disease_B = all(grepl('B', disease)))

#     id disease_B
#  <int> <lgl>    
#1     1 FALSE    
#2     2 TRUE     
#3     3 FALSE    
#4     4 FALSE    
#5     5 FALSE    

如果要对患者的行进行子集化,我们可以使用filter

df %>% group_by(id) %>% filter(all(grepl('B', disease)))

对于问题 2:类似地,我们可以使用any

df %>% group_by(id) %>% summarise(disease_B = any(grepl('A', disease)))

数据

df <- structure(list(id = c(1L, 1L, 1L, 2L, 2L, 2L, 3L, 3L, 3L, 4L, 
4L, 4L, 5L, 5L, 5L), disease = c("A", "A", "A", "B.1", "B.2", 
"B.3", "B", "A", "A", "B", "A", "A", "B", "A", "B")), row.names = c(NA, 
-15L), class = "data.frame")

推荐阅读