You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 02:09:03