You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 04:32:47