r - 根据分组 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 相关联。
解决方案
看看以下是否符合您的要求。
它分组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
推荐阅读
- python - ctypes 等效于“字符名称 [MAX_DEVICE_NAME_LENGTH]”
- c++ - MyClassName 的初始化没有匹配的构造函数
- arrays - 在数组或熊猫数据框中附加元素
- java - 如何使用 JPQL 从 Spring Data Repository 获取 HashMap 结果?
- python - Python多次返回相同时间戳的问题
- spring-boot - Spring Boot - Liquibase - 偶尔执行需要很长时间(60x)
- java - 为什么 postgres 以不同的方式保存日期?
- javascript - Vue 数组正则表达式
- material-ui - 如何将 MkDocs Material 图标添加到模板?
- javascript - 在护照谷歌身份验证策略中使用 res.redirect 时出错