如何用dplyr基于发帖量百分位数创建用户活跃状态二元变量
解决Reddit用户活跃性指示变量的问题
问题背景
需要基于Reddit用户发帖量创建指示变量:发帖量处于80百分位及以上标记为1(活跃用户),否则为0(被动用户)。已通过dplyr的group_by+mutate统计出每个用户的发帖量count,但百分位数识别逻辑有误。
错误原因分析
你之前的代码group_by(username) %>% do(tidy(t(quantile(.$count))))存在逻辑问题:按用户分组后,每个用户的count是单一值(该用户的总发帖量),对单一值计算分位数没有意义,应该基于所有用户的发帖量整体计算80百分位阈值。
正确实现步骤
方法1:分步计算阈值并标记
- 先提取所有用户的唯一发帖量,计算80百分位阈值:
# 提取每个用户的唯一发帖量,计算80分位数 threshold <- df %>% distinct(username, count) %>% # 去重,保留每个用户的发帖量 pull(count) %>% quantile(probs = 0.8, na.rm = TRUE) # 计算80百分位,忽略缺失值
- 在原数据中创建活跃用户指示变量:
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
相关产品推荐
相关产品推荐

