【问题标题】:R: Identify the first occurrence of two consecutive days without observation for each IDR:识别每个 ID 连续两天没有观察到的第一次出现
【发布时间】:2020-09-22 16:23:27
【问题描述】:

我有一个包含 ID、日期和观察值的数据框,我想找到每个 ID 连续两天没有观察到的第一次出现。

示例数据框:

df <- data.frame(ID = c(1,1,1,2,2,2), Date = c(1,2,4,2,3,6), Observation = c(1,1,2,1,2,4) )

想要的结果:

ID   Date
1    5
2    4

虽然我可以让它与一些脏代码一起工作,但这很尴尬,我希望有一个更通用的解决方案。

我的代码:

require(dplyr)
dftemp <- merge(distinct(df, ID), data.frame(Date = c(1:100)))
#Date in the real data frame is always between 1~90, so I choose 100. Probably not true for other data frames.
dftemp <- left_join(dftemp, df)
dftemp$marker <- is.na(dftemp$Observation)
dftemp <- arrange(dftemp, ID, Date)
dftemp$marker2 <- dftemp$marker + c(dftemp$marker[-1], 0) #Shift by 1 row, then add up.
dftemp %>% group_by(ID) %>% filter( marker2 == 2) %>% summarize(Date = min(Date)) %>% as.data.frame

【问题讨论】:

    标签: r


    【解决方案1】:

    这是使用tidyverse 包的一种想法。也许,删除缺少观察的行 (NA)。然后,对于每个ID,确定日期之间的差异。没有观察的 2 天的“第一次出现”可以是差异大于 2 的两天的第一天后的第二天,或者是最后一天的后天。

    编辑:添加了arrange,以确保它按Date排序。

    library(dplyr)
    library(tidyr)
    
    df %>%
      drop_na(Observation) %>%
      group_by(ID) %>%
      arrange(Date) %>%
      mutate(DateDiff = c(0, diff(Date))) %>%
      summarise(FirstOccur = ifelse(any(DateDiff > 2), Date[which(lead(DateDiff) > 2)] + 1, last(Date) + 1))
    

    输出

         ID FirstOccur
      <dbl>      <dbl>
    1     1          5
    2     2          4
    

    【讨论】:

    • 日期需要在喂入变异之前进行排序。否则,data.frame(ID = c(1,1,1,2,2,2), Date = c(4,1,2,2,3,6), Observation = c(1,1,2,1,2,4) ) 的结果将不正确,但解决方案的精髓就在那里。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    • 2021-11-20
    • 1970-01-01
    • 2016-08-01
    • 2021-11-11
    • 1970-01-01
    相关资源
    最近更新 更多