R语言 Dplyr条件逻辑计数行数



嗨,我正在尝试计算数据集中出现的实例。这是一个非常大的数据集。

有关示例,请参见下文:

visitid   procedureid  collectiondatetime source status
100       100.644      2016-12-03 17:20:00      N   COMP
100       100.644      2017-09-21 12:00:00     RS   COMP
100       100.644      2017-08-25 15:48:00      N   COMP
100       100.644      2017-09-01 12:00:00     RS   COMP
100       100.644      2017-08-23 10:31:00      N    CAN
200       100.644      2017-09-01 14:00:00      N   COMP

我想确定在访问期间是否取消了程序(状态= CAN),如果以后重复同一来源的相同程序并完成(状态= COMP)。
我只想总结一下这种情况发生的次数,以确定这些取消的事件发生是否最终得到纠正。

我已经离开R一段时间了,似乎无法弄清楚这一点。

更新的答案

也许这会更好。我创建了一个具有以下情况的新数据集:

  1. CAN/COMP 对之前有多个 CAN(访问 ID = 100)
  2. CAN/COMP 对之前的多个 COMP(访问 ID = 200)
  3. 不带 CAN 的 COMP(访问 ID = 300)
  4. 没有补偿的 CAN(访问 ID = 400)

我假设无论 CAN/COMP 对之前的 CAN 数量是多少,我们只会认为它"纠正"一次。因此,在此数据集中,我们预计会有 2 次更正。

## read in data
text <- "visitid procedureid  collectiondatetime source status
100     100.644 2016-06-01 17:20:00      N    CAN
100     100.644 2016-12-03 17:20:00      N    CAN
100     100.644 2017-08-23 10:31:00      N    CAN
100     100.644 2017-08-25 15:48:00      N   COMP
200     100.644 2017-09-01 12:00:00     RS   COMP
200     100.644 2017-09-21 12:00:00     RS   COMP
200     100.644 2017-09-01 14:00:00     RS   COMP
200     100.644 2017-10-01 14:00:00     RS    CAN
200     100.644 2017-11-01 14:00:00     RS   COMP
300     100.644 2017-11-02 14:00:00     RS   COMP
400     100.644 2017-12-01 14:00:00     RS   CAN"
file <- textConnection(text, encoding = "UTF-8")
coln <- readLines(file, n = 1)
coln <- strsplit(coln, " ")[[1]]
coln <- coln[coln != ""]
on.exit(close(file))
df <- read.fwf(file = file, 
widths = c(3, 12, 20, 7, 7),
strip.white = TRUE,
stringsAsFactors = FALSE)
colnames(df) <- coln
rm(coln, file, text)

然后,我们可以将每个CAN与下一个状态进行匹配。如果下一个状态(按日期/时间)为 COMP,则认为它已"已更正"。

library(tidyr)
library(dplyr)
test <- df %>%
arrange(visitid, procedureid, source, collectiondatetime) %>%
group_by(visitid, procedureid, source) %>%
mutate(corrected = ifelse(status == "COMP", NA, 
ifelse(lead(status) == "COMP", TRUE, NA))) %>%
ungroup() %>%
summarise(n = sum(corrected, na.rm = TRUE))
test


原始答案

不确定这是否正是您想要的,但这里有一个选项。您可以为每次访问、程序和来源创建 CAN/COMP 对。然后,您可以按statusproceduredatetime进行传播,因此您可以检查取消程序后完成程序的对。

library(dplyr)
library(tidyr)
test <- df %>%
mutate(collectiondatetime = as.POSIXct(collectiondatetime)) %>%
arrange(visitid, procedureid, source, collectiondatetime) %>%
group_by(visitid, procedureid, source, status) %>%
mutate(pair = row_number()) %>%
spread(status, collectiondatetime) %>%
ungroup() %>%
mutate(corrected = CAN < COMP)
as.data.frame(test)
# output
visitid procedureid source pair                 CAN                COMP corrected
1     100     100.644      N    1 2017-08-23 10:31:00 2017-08-25 15:48:00      TRUE
2     100     100.644     RS    1                <NA> 2017-09-01 12:00:00        NA
3     100     100.644     RS    2                <NA> 2017-09-21 12:00:00        NA
4     200     100.644      N    1                <NA> 2017-09-01 14:00:00        NA

然后,您可以获取corrected的总和,以获取取消后执行该过程的次数:

sum(test$corrected, na.rm = TRUE)

注意:这假设对于给定的访问、程序和来源,永远不会有一个 COMP 程序,然后是 CAN,然后是 COMP。如果确实发生这种情况,您可以先删除在每次访问/过程/源的CAN程序之前执行的COMP程序。

最新更新