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

如何用dplyr基于发帖量百分位数创建用户活跃状态二元变量

解决Reddit用户活跃性指示变量的问题

问题背景

需要基于Reddit用户发帖量创建指示变量:发帖量处于80百分位及以上标记为1(活跃用户),否则为0(被动用户)。已通过dplyr的group_by+mutate统计出每个用户的发帖量count,但百分位数识别逻辑有误。

错误原因分析

你之前的代码group_by(username) %>% do(tidy(t(quantile(.$count))))存在逻辑问题:按用户分组后,每个用户的count是单一值(该用户的总发帖量),对单一值计算分位数没有意义,应该基于所有用户的发帖量整体计算80百分位阈值。

正确实现步骤

方法1:分步计算阈值并标记

  1. 先提取所有用户的唯一发帖量,计算80百分位阈值:
# 提取每个用户的唯一发帖量,计算80分位数
threshold <- df %>% 
  distinct(username, count) %>%  # 去重,保留每个用户的发帖量
  pull(count) %>% 
  quantile(probs = 0.8, na.rm = TRUE)  # 计算80百分位,忽略缺失值
  1. 在原数据中创建活跃用户指示变量:
df <- df %>% 
  mutate(is_active = ifelse(count >= threshold, 1, 0))

方法2:一步完成(更简洁)

取消分组后直接基于整个数据集的count计算阈值并标记:

df <- df %>% 
  # 确保每个用户的发帖量统计正确(若已完成此步可省略)
  group_by(username) %>% 
  mutate(count = n()) %>% 
  ungroup() %>%  # 关键:取消用户分组,让quantile针对所有用户的发帖量计算
  # 创建指示变量,as.integer将布尔值转为0/1
  mutate(is_active = as.integer(count >= quantile(count, probs = 0.8, na.rm = TRUE)))

验证(基于你提供的count向量)

用你给出的count向量测试阈值:

count_vec <- c(15L, 9L, 1L, 1L, 1L, 1L, 1L, 1L, 15L, 15L, 15L, 1L, 15L, 1L, 
1L, 15L, 1L, 1L, 15L, 2L, 15L, 1L, 15L, 1L, 15L, 2L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 3L, 15L, 191L, 3L, 191L, 
191L, 1L, 191L, 191L, 2L, 191L, 191L, 1L, 191L, 1L, 191L, 191L, 
191L, 3L, 191L, 98L, 191L, 1L, 191L, 2L, 191L, 9L, 1L, 191L, 
1L, 1L, 3L, 191L, 191L, 191L, 2L, 3L, 1L, 1L, 2L, 2L, 191L, 191L, 
191L, 191L, 17L, 1L, 3L, 4L, 3L, 22L, 2L, 3L, 3L, 191L)

# 计算80百分位
quantile(count_vec, probs = 0.8)
# 输出:80% = 15

因此,发帖量≥15的用户会被标记为活跃用户(is_active=1),其余为被动用户。

内容的提问来源于stack exchange,提问作者nesta1990

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 13:43:04