我有一组观察到的护士护理病人的行为,并记录他们触摸或做的事情。这可能看起来像:
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
为了得到计数,我们可以sum
hands_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