na.rm = TRUE在dplyr的mutate与summarise中失效的解决方案咨询
处理含大量NA值的数据集(保留行+正确计算均值/求和)
核心解决思路
计算均值、求和这类统计量时,直接给mean()、sum()、rowSums()等函数加上na.rm = TRUE参数,就能自动忽略NA值完成计算——既不用删除包含NA的行,也不需要把NA替换成0。
初始示例脚本修正
你原来的summarise代码里,所有统计函数都没加na.rm = TRUE,只要列中有NA,计算结果就会返回NA。修正后:
data_week1 <- data_calc %>% dplyr::group_by(room, pen, block, treatment)%>% dplyr::filter(week == '1')%>% dplyr::summarise( adfi_week1 = sum(feedintake/7, na.rm = TRUE), # 加na.rm避免feedintake有NA时结果为NA ph = mean(ph, na.rm = TRUE), ds = mean(ds, na.rm = TRUE), fecalscore = mean(fecalscore, na.rm = TRUE) )
说明:ADFI是每日测量值,sum(..., na.rm = TRUE)会跳过feedintake为NA的日期,用剩余有效数据计算总和,符合需求。
更新后代码的错误修正
你的mutate代码报错是因为**na.rm = TRUE放错了位置**——它是统计函数(如sum/rowSums)的参数,不能直接写在算术表达式后面。对于加减运算,需要用rowSums()包裹变量并设置na.rm = TRUE,才能忽略NA值计算:
data_calc <- data_ruw %>% dplyr::group_by(datum, afdeling, hok, blok, behandeling) %>% dplyr::mutate( voerinname_ochtend_kgbrij = voerinname_ochtend_kgbrij*3, voerinname_middag_kgbrij = voerinname_middag_kgbrij*3, # 用rowSums处理加减,自动忽略NA voeropname_dag_brij = rowSums(cbind(voerinname_ochtend_kgbrij, voerinname_middag_kgbrij), na.rm = TRUE) - rowSums(cbind(voer_uit_ochtend, voer_uit_middag), na.rm = TRUE), # 乘法运算若遇NA,结果保留NA(符合不替换0的要求) voeropname_kgdroogvoer = voeropname_dag_brij * 0.25/0.88, # 同理处理mest_ds的计算 mest_ds = mest_gewicht_in - rowSums(cbind(mest_gewicht_uit, 5.6, 7), na.rm = TRUE) )
说明:
rowSums(cbind(...), na.rm = TRUE)会只对非NA的数值求和,不会将NA视为0,也不会因单个NA导致整个结果为NA(除非所有参与计算的变量都是NA)。- 乘法运算中如果
voeropname_dag_brij是NA,结果会保留NA,完全符合不替换0的要求。
内容的提问来源于stack exchange,提问作者Kristel
相关产品推荐
相关产品推荐

