如何修改自定义行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
相关产品推荐
相关产品推荐

