我正在尝试找出一个过滤器来标识以下数据框的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相关联。
答案 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