如何找出交通出行后0-1天内未在目标地点打卡的记录?
筛选交通出行后0-1天内未打卡的人员记录
问题背景
现有两个数据框:
transportation:记录人员的交通出行日期、方式和姓名location:记录人员的地点打卡日期、原因和姓名
需要找出所有出行后0-1天内未留下打卡记录的出行实例。原方法仅能匹配当日打卡的情况,无法处理次日打卡的合法场景(比如Person D在2022-01-04出行,2022-01-05打卡,不应被标记为异常)。
解决方案
核心思路是:先将日期转换为可计算的日期类型,再对每条出行记录,检查对应人员是否在「出行日期」到「出行日期+1天」的范围内有打卡记录,最终筛选出无符合条件打卡的记录。
完整代码实现
library(tidyverse) # 1. 准备数据并转换日期类型(必须步骤,否则无法做日期计算) Date <- c("2022-01-01","2022-01-02","2022-01-03","2022-01-04","2022-01-04","2022-01-05", "2022-01-06") Method <- c("train","taxi","train","bus","bus","bus", "train") Person <- c("A","B","C", "D", "E", "F", "G") transportation <- data.frame(Date,Method,Person) %>% mutate(Date = as.Date(Date)) Date2 <- c("2022-01-01","2022-01-02","2022-01-03","2022-01-05") Reason <- c("x","Y","Z","W") Person2 <- c("A","B","C", "D") location <- data.frame(Date2,Reason,Person2) %>% mutate(Date2 = as.Date(Date2)) # 2. 方法一:逐行检查(逻辑直观,适合小数据) abnormal_records1 <- transportation %>% mutate( # 检查当前人员是否在出行日及次日有打卡 has_valid_checkin = map_lgl(1:nrow(.), function(i) { target_person <- .$Person[i] travel_date <- .$Date[i] any(location$Person2 == target_person & location$Date2 >= travel_date & location$Date2 <= travel_date + 1) }) ) %>% filter(!has_valid_checkin) # 保留无有效打卡的记录 # 3. 方法二:关联后分组汇总(效率更高,适合大数据) abnormal_records2 <- transportation %>% left_join(location, by = c("Person" = "Person2")) %>% mutate( # 计算打卡日期与出行日期的差值 date_diff = as.integer(Date2 - Date), # 判断是否为0-1天内的有效打卡 valid_checkin = !is.na(date_diff) & date_diff >= 0 & date_diff <= 1 ) %>% group_by(Date, Method, Person) %>% summarize(has_valid_checkin = any(valid_checkin, na.rm = TRUE)) %>% filter(!has_valid_checkin) # 查看结果 print(abnormal_records1) print(abnormal_records2)
结果说明
两种方法都会输出以下异常记录:
- Person E(2022-01-04乘bus出行):无任何打卡记录
- Person F(2022-01-05乘bus出行):无0-1天内的打卡记录
- Person G(2022-01-06乘train出行):无任何打卡记录
而Person D的2022-01-04出行记录会被排除,因为他在次日(2022-01-05)有合法打卡。
内容的提问来源于stack exchange,提问作者Indescribled
相关产品推荐
相关产品推荐

