【问题标题】:R: Select earliest date after permanent change in status (not just earliest date conditional on status, but conditional on permanent change to status)R:选择身份永久更改后的最早日期(不只是以身份为条件的最早日期,而是以永久更改身份为条件)
【发布时间】:2020-01-30 17:13:36
【问题描述】:

我的数据看起来像这样

data <- data.frame(unique_id = c(rep("A",6), rep("B",6)),
               year = c(seq(2010,2015),seq(2010,2015)),
               value = c(100,100,100,0,0,0,100,0,100,100,0,0))

我想要这个:

output <- data.frame(unique_id = c("A","B"),
                 year = c(2013,2014))

最有效的方法是什么?我认为按照data %&gt;% group_by(unique_id) %&gt;% filter(value==0) %&gt;% summarise(yr_closed = min(year)) 的方式使用 dplyr 会起作用,但这显然不会返回我想要的输出,而且我不知道使用哪些函数来实现这一点。

提前致谢!

【问题讨论】:

    标签: r dplyr subset


    【解决方案1】:

    这是rleid的选项

    library(dplyr)
    library(data.table)
    data %>%
       group_by(unique_id) %>% 
       slice(which.max(rleid(value))) %>%
       select(-value)
    # A tibble: 2 x 2
    # Groups:   unique_id [2]
    #  unique_id  year
    #  <fct>     <int>
    #1 A          2013
    #2 B          2014
    

    【讨论】:

      【解决方案2】:

      对于将来引用此问题的任何人,最终效果最好的是将arrange 添加到@akrun 的答案中。我还从最后删除了select

      data %>% group_by(unique_id) %>% arrange(year) %>% slice(which.max(rleid(value)))
      

      这对我的真实数据更好,因为我按两个类别进行分组,这导致日期变量无序(因此最大 rleid 值并不总是最新日期)。保持value 对我也有帮助,因为我的最终目标是用最近一年的非零值将观察标记为“开放”,如果它们的最新值为零,则将它们标记为“关闭”。

      【讨论】:

        猜你喜欢
        • 2011-01-09
        • 1970-01-01
        • 2023-03-30
        • 2010-12-10
        • 2018-08-03
        • 2018-08-23
        • 1970-01-01
        • 2016-01-04
        • 1970-01-01
        相关资源
        最近更新 更多