使用R的group_by和summarise分箱时输出全为NA的问题排查
问题排查与解决方案
可能的原因
你的代码逻辑本身是正确的,但输出出现大量NA,最可能的原因是原始数据的Intensity列中存在NA值。max()函数默认会在遇到NA时返回NA,哪怕组内只有一个NA,整组的结果都会变成NA。你虽然确认了列是数值型,但数值型列完全可以包含NA值。
正确的实现方法
针对这个问题,只需要在max()中添加na.rm = TRUE参数,忽略NA值后再计算最大值:
df_binned <- df %>% mutate(Mass = round(Mass, 0)) %>% group_by(Spectrum, Mass) %>% summarise(Intensity = max(Intensity, na.rm = TRUE)) %>% ungroup()
另外,如果你需要保留原始行的其他潜在字段(而不仅仅是聚合后的最大值),可以用slice_max()直接筛选每组中Intensity最高的行,效果一致:
df_binned <- df %>% mutate(Mass = round(Mass, 0)) %>% group_by(Spectrum, Mass) %>% slice_max(Intensity, n = 1, with_ties = FALSE, na.rm = TRUE) %>% ungroup()
注:
with_ties = FALSE确保当同一组内有多个相同的最大Intensity值时,只保留一行;如果需要保留所有最大值行,可以把这个参数设为TRUE。
内容的提问来源于stack exchange,提问作者Larry Cai
相关产品推荐
相关产品推荐

