【问题标题】:Filter data frame to keep rows until column values changes to 0过滤数据框以保留行,直到列值更改为 0
【发布时间】:2020-07-11 03:37:05
【问题描述】:

我有这个数据框,

`df <- tibble(
  key = rep(1:3, c(8,4,5)),
  Date = c(seq(as.Date('2016-12-17'), as.Date('2016-12-19'), '1 day'),
       seq(as.Date('2016-12-21'), as.Date('2016-12-23'), '1 day'),
       seq(as.Date('2016-12-29'), as.Date('2016-12-30'), '1 day'),
       seq(as.Date('2017-05-18'), as.Date('2017-05-21'), '1 day'),
       seq(as.Date('2017-05-18'), as.Date('2017-05-20'), '1 day'),
       seq(as.Date('2017-05-23'), as.Date('2017-05-24'), '1 day')),
  flag= c(1,1,1,0,1,1,0,1,1,1,1,1,1,1,1,0,1)
  )` 

对于每个“键”,我需要在“标志”第一次变为 0 之前的“日期”的最大值,或者如果“键”没有 0 标志,则返回“日期”的最大值。

我需要以下输出。

key Date        flag
 1 2016-12-19     1
 2 2017-05-21     1
 3 2017-05-20     1

有人可以帮我解决这个问题吗?

谢谢。

【问题讨论】:

    标签: r dplyr dt date-arithmetic


    【解决方案1】:

    在下面的代码中,我使用了 match 返回第一个匹配项的位置这一事实。然后,我使用行的索引创建一个额外的列,以便在第一次出现 flag = 1 后过滤所有行

    df %>% 
      group_by(key) %>% 
      arrange(Date) %>% 
      mutate(idx = 1:n()) %>% 
      filter(idx < match(0,flag) | is.na(match(0,flag))) %>% 
      summarise(Date = max(Date))
    

    希望这会有所帮助!

    【讨论】:

      猜你喜欢
      • 2017-05-10
      • 2020-10-24
      • 1970-01-01
      • 2020-07-18
      • 2017-11-12
      • 1970-01-01
      • 1970-01-01
      • 2018-07-07
      相关资源
      最近更新 更多