我有一套对护士进行病人护理的观察行为,并记录他们触摸或做的事情。这可能看起来像这样:
df<-data.frame(ActivityID=rep(1:3, each=3),
Action=c("Door", "Hygiene", "Patient", "Door", "Patient", "Door", "Door", "Patient", "Hygiene"))我想要检查他们是否在第一次接触病人之前洗手,并计算每一次ActivityID中有多少次发生这种情况。本质上,我想知道对于每个活动,X是否发生在Y之前。
我的想法是使用它来查找Patient和Hygiene的第一个匹配项:
require(dplyr)
a=df%>%
group_by(ActivityID) %>%
which(Action=="Hygiene")
b=df%>%
group_by(ActivityID) %>%
which(Action=="Patient")
which(a<b)但这在管状结构中似乎不起作用,有时,它们不会接触病人。任何帮助都将不胜感激。
发布于 2020-08-04 21:22:13
可以使用以下方法计算唯一活动的总数:
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)。
发布于 2020-08-05 01:21:30
这是使用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 https://stackoverflow.com/questions/63247591
复制相似问题