基于成对字段的组合ID的Fitler

时间:2019-05-19 11:05:12

标签: r dplyr

我正在尝试找出一个过滤器来标识以下数据框的ID。

x <- data.frame("log_id" = c(16006,16006,16006,25109,25109,25109,25109,20506,20506),
                "status" = c(0,1,1,0,1,1,1,0,1), 
                "version" = c(1,2,3,1,2,3,4,1,2),
                "date_time" = c(as.Date("2018-10-27 00:00:00"), as.Date("2019-01-06 00:00:00"),as.Date("2019-01-16 00:00:00"),
                                as.Date("2018-10-27 00:00:00"), as.Date("2017-01-06 00:00:00"), as.Date("2019-02-17 00:00:00"),
                                as.Date("2018-10-27 00:00:00"), as.Date("2019-01-12 00:00:00"),as.Date("2019-02-12 00:00:00")))

我需要标识id,以便与较高版本号关联的date_time在按log_id分组之后,应该比先前的版本号更新。

换句话说,对于每个log_id,具有更高版本的记录的日期时间应比前一个记录的日期时间> =。我需要找到带有失败的事件的log_id并记录特定的“ log_id”。

我尝试了一个基于group_by的dplyr解决方案,并且使用了ifelse,但无法获得正确的语法。

solution <- x %>%
  select(log_id,
         status,
         version,
         date_time) %>%
  group_by(log_id) %>%
  {(ifelse(date_time[version== 1] < date_time[version!=  1], 0,1))} %>%
  arrange(log_id)

我希望将结果存储在向量中,以便识别出所有有问题的“ log_id”。

对于此数据框,预期输出为:

"incidented log_id = " "25109"

原因是log_id = 25109的date_time值(“ 2017-01-06 00:00:00”)与其版本= 2关联,早于date_time值(“ 2018-10-27 00:00”): 00“)与其版本= 1相关联。

1 个答案:

答案 0 :(得分:0)

查看以下内容是否符合您的要求。
它按log_id分组,然后计算date_time值之间的差。如果差异小于零,则前一个date_time的值较高,而该逻辑结果仅filter

第一个版本保留整行,下一个date_time小于前一个

x %>%
  group_by(log_id) %>%
  filter(c(0, diff(date_time)) < 0)
## A tibble: 2 x 4
## Groups:   log_id [1]
#  log_id status version date_time 
#   <dbl>  <dbl>   <dbl> <date>    
#1  25109      1       2 2017-01-06
#2  25109      1       4 2018-10-27

第二个版本仅返回有问题的log_id

x %>%
  group_by(log_id) %>%
  filter(c(0, diff(date_time)) < 0) %>%
  select(log_id) %>%
  unique()
## A tibble: 1 x 1
## Groups:   log_id [1]
#  log_id
#   <dbl>
#1  25109