Подсчитайте, сколько раз медсестра моет руки перед контактом с пациентом: X перед Y, group_by (ID)? - PullRequest
1 голос
/ 04 августа 2020

У меня есть набор наблюдений за поведением медсестер, осуществляющих уход за пациентами, и я записываю, что они прикасаются или делают. Это может выглядеть так:

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

Я хотел бы проверить, sh ли они держали руки перед первым прикосновением к пациенту для каждого ActivityID и посчитать, сколько ActivityID это происходит. По сути, я хотел бы знать, происходит ли X перед Y для каждого действия. кажется, что они не работают в форме трубы, а иногда они не касаются пациента. Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

4 голосов
/ 04 августа 2020

Общее количество уникальных действий можно рассчитать с помощью:

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      

Чтобы получить счет, мы можем sum hands_washed столбец, т.е. sum(df1$hands_washed).

2 голосов
/ 04 августа 2020

Вот еще один вариант использования case_when из пакета dplyr.

 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     
...