首页 > 解决方案 > 根据分组 ID 的配对字段过滤

问题描述

我正在尝试找出一个过滤器来识别以下数据帧的 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,以便在按 log_id 分组后,与更高版本号关联的 date_time 应该比以前的版本号更新。

换句话说,对于每个 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”)与其 version=2 相关,比 date_time 值(“2018-10-27 00:00:00”)更早与其版本 = 1 相关联。

标签: rdplyr

解决方案


看看以下是否符合您的要求。
它分组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只返回有问题的 's。

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

推荐阅读