Dplyr条件逻辑计数行数
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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一段时间了,似乎无法解决这个问题。
答案
更新的答案
也许这会更好。我创建了一个具有以下情况的新数据集:
- CAN / COMP对之前的多个CAN(visitid = 100)
- CAN / COMP对之前的多个COMP(visitid = 200)
- 没有CAN的COMP(visitid = 300)
- 没有COMP的CAN(visitid = 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。然后你可以通过proceduredatetime
传播status
,这样你就可以检查程序在取消后完成的对。
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过程。
以上是关于Dplyr条件逻辑计数行数的主要内容,如果未能解决你的问题,请参考以下文章