r-计算护士在与患者接触前洗手的次数:X在Y之前,group_by(ID)吗

  • 本文关键字:group 之前 by ID 患者 计算 接触 r dplyr
  • 更新时间 :
  • 英文 :


我有一组观察到的护士护理病人的行为,并记录他们触摸或做的事情。这可能看起来像:

df<-data.frame(ActivityID=rep(1:3, each=3),
Action=c("Door", "Hygiene", "Patient", "Door", "Patient", "Door", "Door", "Patient", "Hygiene"))

我想检查他们在第一次接触患者之前是否为每个ActivityID洗手,并计算有多少个ActivityID出现这种情况。从本质上讲,我想知道每个活动的X是否发生在Y之前。

我的想法是用它来发现患者和卫生方面的第一次出现:

require(dplyr)
a=df%>%
group_by(ActivityID) %>%
which(Action=="Hygiene")
b=df%>%
group_by(ActivityID) %>%
which(Action=="Patient")
which(a<b)

但这似乎在管道形式下不起作用,有时,它们不会接触到患者。任何帮助都将不胜感激。

可以使用计算总的唯一活动

library(dplyr)
total_Activities <- n_distinct(df$ActivityID)
total_Activities
#[1] 3

我们可以编写一个功能来检查在第一次触摸患者之前是否洗手:

hands_washed_before_touch <- function(x) {
ind1 <- which(x == 'Hygiene')
ind2 <- which(x == 'Patient')
length(ind1) && length(ind2) && ind1[1] < ind2[1]
}

并按组使用:

df1 <- df %>% 
group_by(ActivityID) %>% 
summarise(hands_washed = hands_washed_before_touch(Action))
df1
# ActivityID hands_washed
#       <int> <lgl>       
#1          1 TRUE        
#2          2 FALSE       
#3          3 FALSE      

为了得到计数,我们可以sumhands_washed列,即sum(df1$hands_washed)

这里是使用dplyr包中的case_when的另一种选择。

library(dplyr)
df1<-  df %>% 
group_by(ActivityID) %>% 
mutate(hands_washed = case_when(
!any(Action == "Hygiene") ~ "False",
min(c(which(Action == "Hygiene"), Inf)) > which.max(Action == "Patient")~ "False",
TRUE ~ "True"))%>%
ungroup()
df1
# A tibble: 9 x 3
# Groups:   ActivityID [3]
#  ActivityID Action  hands_washed
#       <int> <fct>   <chr>       
#1          1 Door    True        
#2          1 Hygiene True        
#3          1 Patient True        
#4          2 Door    False       
#5          2 Patient False       
#6          2 Door    False       
#7          3 Door    False       
#8          3 Patient False       
#9          3 Hygiene False     

最新更新