如何为同一UniqueID下阈值达标后20小时内的行重复标记统一标识
R实现交易记录的规则化标记需求
我有一个数万行的DataFrame,需新增Flagged分类列,标记规则如下:
- 当
Transactions列值≥阈值(示例为100)时,标记该行,以及同一UniqueID下、该交易时间后20小时内的所有后续行为FR - 每个
UniqueID每次触发阈值条件时都执行该逻辑,其余行标记为NR
示例数据
library(lubridate) UniqueID <- c(214123, 214123, 214123, 214123, 987556, 987556, 987556, 987556, 987556) datetime <- ymd_hms("2021-12-5 21:16:00", "2021-12-6 10:16:00", "2021-12-8 08:16:00", "2021-12-30 01:26:00", "2021-12-5 10:33:00", "2021-12-6 08:16:00", "2021-12-6 13:26:00", "2022-01-6 13:26:00", "2022-01-6 13:26:00") Transactions <- c(100, 30, 20, 110, 30, 105, 50, 20, 140) df <- data.frame(UniqueID, datetime, Transactions) df
字段说明
UniqueID:用户唯一标识符datetime:交易发生时间Transactions:交易金额
期望结果
满足规则后,第1、2、4、6、7、9行标记为FR,其余为NR,最终数据如下:
library(lubridate) UniqueID <- c(214123, 214123, 214123, 214123, 987556, 987556, 987556, 987556, 987556) datetime <- ymd_hms("2021-12-5 21:16:00", "2021-12-6 10:16:00", "2021-12-8 08:16:00", "2021-12-30 01:26:00", "2021-12-5 10:33:00", "2021-12-6 08:16:00", "2021-12-6 13:26:00", "2022-01-6 13:26:00", "2022-01-6 13:26:00") Transactions <- c(100, 30, 20, 110, 30, 105, 50, 20, 140) Flagged <- c("FR", "FR", "NR", "FR", "NR", "FR", "FR", "NR", "FR") df <- data.frame(UniqueID, datetime, Transactions, Flagged) df
解决方案
采用dplyr分组+向量化操作,避免循环,高效处理数万行数据:
library(dplyr) library(lubridate) library(purrr) # 自定义参数:阈值和时间窗口 threshold <- 100 time_window <- hours(20) df_processed <- df %>% # 按用户分组,确保每组交易按时间排序 group_by(UniqueID) %>% arrange(datetime, .by_group = TRUE) %>% # 提取当前用户所有触发阈值的交易时间 mutate(trigger_times = list(datetime[Transactions >= threshold])) %>% # 检查当前行是否落在任意触发时间的20小时窗口内 mutate(Flagged = ifelse( map_lgl(trigger_times, ~ any(datetime >= .x & datetime <= .x + time_window)), "FR", "NR" )) %>% # 移除辅助列并取消分组 select(-trigger_times) %>% ungroup() # 查看处理结果 df_processed
核心逻辑说明
- 先按用户分组并排序,保证时间顺序正确
- 提取每个用户的所有触发阈值时间点,存为列表列
- 对每一行,判断其时间是否落在任意触发点的20小时窗口内,满足则标记
FR - 向量化操作替代循环,大幅提升大数据量处理效率
内容的提问来源于stack exchange,提问作者BarelySapeintOrangutan
相关产品推荐
相关产品推荐

