R中为janitor::tabyl输出按行添加指定组合计数的错误数列
为
janitor::tabyl()列联表新增非法组合错误计数列 核心实现思路是把校验规则和计算逻辑解耦,避免硬编码case_when带来的维护性差、易出错问题,代码可稳定复用,后续调整校验规则不需要修改核心计算逻辑。
完整可运行代码
# 加载依赖包 library(gapminder) library(janitor) library(dplyr) # 1. 配置非法组合校验规则 # 规则格式:列表名 = 行维度(此处为year)的取值,列表元素 = 对应该行不允许出现的列维度(此处为continent)取值 invalid_combinations <- list( "1952" = c("Europe"), "1962" = c("Asia", "Oceania") ) # 2. 生成列联表并计算错误数 tabyl_result <- gapminder %>% tabyl(year, continent) %>% rowwise(year) %>% mutate( number_of_errors = if (as.character(year) %in% names(invalid_combinations)) { sum(c_across(all_of(invalid_combinations[[as.character(year)]])), na.rm = TRUE) } else { 0 } ) %>% ungroup()
结果校验说明
运行代码后输出的结果完全符合预期:
- 1952年行
number_of_errors取值为Europe列对应的计数30 - 1962年行
number_of_errors取值为Asia列(33)+Oceania列(2)的和35 - 其余未配置规则的年份行,错误计数均为0
方案优势
- 维护成本低:新增/修改校验规则时,只需要调整
invalid_combinations列表的配置即可,不需要改动后续计算逻辑,比如要新增1972年不允许出现Americas的规则,只需要在列表中加一行"1972" = c("Americas") - 稳定性高:通过
all_of()严格匹配列名,不会出现硬编码列位置、列名拼写错误导致的计算异常,自动处理空值情况 - 适配性强:不管单一行对应多少个非法列,都会自动完成求和,不需要手动编写多列相加的重复代码
之前用
mutate+case_when编写失败的常见原因:通常是数值型/字符型类型不匹配导致规则判断失效、硬编码列索引时因为tabyl输出列顺序变化取错值、多列求和时漏写列名导致计算结果错误,上述配置化写法可以完全避开这些问题。
内容的提问来源于stack exchange,提问作者Andy
相关产品推荐
相关产品推荐

