Stata中如何为Steam硬核/休闲玩家子组正确聚合总游戏时长?
解决Stata中按玩家类型聚合总游戏时长的问题
问题原因
你当前使用的egen playtime_type = sum(playtime_sum), by(hightype)结果不符合预期,核心问题是数据集存在重复的用户记录:同一个steamid(用户)对应多条游戏记录,且每条记录的playtime_sum是该用户的总游戏时长(而非单游戏时长),直接求和会重复计算同一用户的时长,导致分组总和被错误放大。
比如你的示例中,用户76561197960265730出现3次,每次playtime_sum都是45,原命令会把45累加3次,但实际上该用户的总时长只应统计1次。
解决方法
根据你的数据结构,提供两种可行方案:
方案1:先去重再计算分组总和
先保留每个用户的唯一记录(同一用户的playtime_sum和hightype一致),再按玩家类型求和:
// 去除重复的用户记录,保留每个steamid的唯一行 duplicates drop steamid, force // 为每条记录生成对应玩家类型的总时长(保留原数据结构) egen total_playtime_by_type = sum(playtime_sum), by(hightype) // 或者直接生成仅包含分组总和的汇总表(若不需要原数据) collapse (sum) total_playtime=playtime_sum, by(hightype)
方案2:先计算用户总时长再分组求和(若playtime_sum是单游戏时长)
如果playtime_sum是单游戏的游玩时长(而非用户总时长),需要先计算每个用户的总时长,再按玩家类型聚合:
// 计算每个用户的总游戏时长 bysort steamid: egen user_total_playtime = sum(playtime_sum) // 去除重复用户记录 duplicates drop steamid, force // 按玩家类型求和(保留原数据结构) egen total_playtime_by_type = sum(user_total_playtime), by(hightype) // 或者直接生成汇总表 bysort steamid: egen user_total_playtime = sum(playtime_sum) collapse (sum) total_playtime=user_total_playtime, by(hightype)
验证结果
以你的示例数据为例,方案1执行后,hightype=0的总时长应为0 + 45 + 1710 + 11 = 1766,这才是该类型玩家的真实总游戏时长总和。
内容的提问来源于stack exchange,提问作者Ji Xu
相关产品推荐
相关产品推荐

