按同一user_id聚合不同字段为何返回不同行数?技术求助
分析聚合结果行数不一致的原因
这个问题我之前也碰到过,其实核心原因大概率和数据里的缺失值或者隐性异常有关,我给你拆解几个最可能的情况:
缺失值(NA)的差异化处理
aggregate()函数在执行sum聚合时,如果某一个user_id分组下的目标列(比如usd_amount)所有值都是NA,这个分组会被直接排除在结果之外;但如果该user_id在number_of_hits列有非NA的有效值,就会保留在user_hits的结果里。反过来,如果某个user_id的number_of_hits全是NA但usd_amount有有效值,也会导致两个结果集的行数差异。你可以用以下代码快速验证:
# 找出usd_amount为NA的用户 na_usd_users <- unique(subset(user_set, is.na(usd_amount))$user_id) # 检查这些用户在number_of_hits里是否有有效值 any(!is.na(subset(user_set, user_id %in% na_usd_users)$number_of_hits))目标列的数据类型或隐性异常值
有可能usd_amount列存在隐性的非数值内容(比如看起来是数值但实际是带符号的字符型,或者存在空字符串),导致sum()无法计算,进而让这些分组被排除。你可以先检查列的类型和异常值:# 查看usd_amount的类型 str(user_set$usd_amount) # 尝试转换为数值,检查是否产生新的NA(说明有非数值内容) any(is.na(as.numeric(as.character(user_set$usd_amount))))直接对比两个结果集的用户集合
最直接的方法是找出只出现在其中一个结果集里的用户,然后查看原始数据:hits_users <- user_hits$user_id usd_users <- user_usd$user_id # 只在number_of_hits聚合结果里的用户 only_hits <- setdiff(hits_users, usd_users) # 只在usd_amount聚合结果里的用户 only_usd <- setdiff(usd_users, hits_users) # 查看这些用户的原始数据 subset(user_set, user_id %in% only_hits) subset(user_set, user_id %in% only_usd)观察这些用户的对应列值,就能直观找到问题所在。
内容的提问来源于stack exchange,提问作者DGav
相关产品推荐
相关产品推荐

