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

如何修改自定义行NA统计函数以识别同一mutate内的重编码NA值

问题根源

你的函数无法识别同一条mutate内新生成的NA,和rowSums无关,核心原因是:在单个mutate调用中,用.传入函数的永远是输入到该mutate的原始数据框,不会包含同一条mutate内前面步骤对列的修改。你拆分到两个mutate的时候,第二个mutate拿到的是第一个修改后的数据框,所以统计正常。


调整后的函数

借助dplyr 1.0.0+版本提供的pick()函数,可以动态读取mutate上下文内最新的列状态,不需要手动传入整个数据框,修改后的代码如下:

library(tidyverse)

count_na_row <- function(vars = everything()){
  rowSums(is.na(pick({{ vars }})))
}

count_na_row_where <- function(.fun = NULL){
  if(is.null(.fun)){
    warning('.fun is NULL. No function is applied. Counts NAs on all columns')
    rowSums(is.na(pick(everything())))
  } else {
    rowSums(is.na(pick(where(.fun))))
  }
}

调用示例

调整后不需要给函数传.参数,直接在同一条mutate内调用即可识别最新的NA值:

df <- 
  tibble(
    var1 = c(1, 2, NA, 1, 3, NA, 1, 7),
    var2 = c(NA, 3, 1, 3, NA, 9, NA, 4),
    varstr = c("A", "B", "", "", 'F', 'C', 'A', "M")
  )

# 同一条mutate内先重编码生成NA,再统计,可正常识别
df %>% 
  mutate(
    varstr = ifelse(varstr == "", NA, varstr),
    na_count = count_na_row(),
    na_count_str = count_na_row_where(is.character),
    na_count_num = count_na_row_where(is.numeric)
  )

如果需要统计指定列的NA,直接传入列名即可,例如count_na_row(c(var1, var2))。


内容的提问来源于stack exchange,提问作者oskjerv

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 12:15:03