R语言dplyr分组聚合:求和时忽略NA及对应count值
解决方案
你的问题出在计算sum(count)时没有排除对应product为NA的行,导致Bob的count总和错误包含了3、4、5这些无效值。要实现需求,有两种简洁的处理方式:
方法一:先过滤无效行再计算
先移除product为NA的行,再按name分组计算总和的比值:
my_df %>% mutate(product = count*score) %>% filter(!is.na(product)) %>% # 过滤掉product为NA的行 group_by(name) %>% summarize(result = sum(product)/sum(count))
运行结果:
name result <chr> <dbl> 1 Bob 5 2 John 2.89
方法二:在求和时指定有效count
不需要过滤行,直接在sum(count)里只计算对应product非NA的count值:
my_df %>% mutate(product = count*score) %>% group_by(name) %>% summarize( result = sum(product, na.rm = TRUE) / sum(count[!is.na(product)], na.rm = TRUE) )
这个方法和方法一结果一致,适合不想修改原数据行数的场景。
原代码错误原因
原代码中sum(count)会把分组内所有count值相加,哪怕对应的product是NA,所以Bob的count总和被计算为2+3+4+5=14,而正确的应该只保留product非NA对应的2,最终比值为10/2=5。
内容的提问来源于stack exchange,提问作者mapleleaf
相关产品推荐
相关产品推荐

