如何在R中基于与事件y的距离为数据行分配两类权重
dplyr 权重计算实现
前置说明
数据集每组USER有且仅有1条event="y"的记录,以下代码基于dplyr实现两种权重规则,默认按USER分组后按时间升序排列,权重总和为1。
1. 时间衰减模式
越靠近event="y"的行权重越高,完全匹配示例效果:
library(dplyr) # 时间衰减权重计算 df_time_decay <- df %>% group_by(USER) %>% arrange(timestamp, .by_group = TRUE) %>% mutate( # 线性递增权重,和示例输出完全一致 weight = row_number() / sum(seq(n())) ) %>% ungroup()
如果event="y"不一定在分组末行,可改用时间差计算,逻辑更通用:
df_time_decay <- df %>% group_by(USER) %>% mutate( y_time = timestamp[event == "y"], # 时间差越小权重越高,结果归一化 time_diff = abs(as.numeric(difftime(timestamp, y_time, units = "secs"))), weight = (1 / (time_diff + 1e-6)) / sum(1 / (time_diff + 1e-6)) ) %>% ungroup() %>% select(-y_time, -time_diff)
2. U型权重模式
分组首行和event="y"行权重最高,中间行权重均分剩余占比,匹配示例效果:
df_u_type <- df %>% group_by(USER) %>% arrange(timestamp, .by_group = TRUE) %>% mutate( n = n(), y_pos = which(event == "y"), weight = case_when( n == 1 ~ 1, # 单条记录权重直接为1 row_number() == 1 | row_number() == y_pos ~ 0.4, TRUE ~ 0.2 / (n - 2) ) ) %>% ungroup() %>% select(-n, -y_pos)
内容的提问来源于stack exchange,提问作者John Thomas
相关产品推荐
相关产品推荐

