Dplyr条件逻辑计数行数

时间:2018-02-28 16:52:34

标签: 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 个答案:

答案 0 :(得分:1)

更新答案

也许这会更好用。我制作了一个新的数据集,其中包含以下情况:

  1. CAN / COMP对之前的多个CAN(visitid = 100)
  2. CAN / COMP对之前的多个COMP(visitid = 200)
  3. 没有CAN的COMP(visitid = 300)
  4. 没有COMP的CAN(visitid = 400)
  5. 我假设无论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,那么它被认为是#34;已经纠正&#34;。

    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程序。