R语言expss包:基于总例数隐藏mrset统计值的函数实现问题
修复后的R函数实现
原代码存在几个关键问题:
- 用
eval(rlang::parse_expr)拼接代码的方式不安全且易出错,应改用非标准求值语法构建参数 - 错误使用data.table的
:=语法修改expss表格对象,expss表格需要专属的修改逻辑 - 总例数判断条件写成了
<3,不符合需求的≤3 - 获取有效例数的方式不正确,需从表格的「#Total cases」行提取数值
以下是修复后的完整代码:
library(expss) library(rlang) fun1 <- function(data, varlist, Banner) { # 安全构建mrset参数,避免字符串拼接风险 t1 <- cross_cpct(data, mrset(!!!syms(varlist)), Banner) # 定位总例数所在行 total_row <- which(rownames(t1) == "#Total cases") # 提取各列的总例数值 total_cases <- as.numeric(t1[total_row, -1]) # 筛选出总例数≤3的列索引(+1是因为第一列为行名) cols_to_replace <- which(total_cases <= 3) + 1 # 替换对应列的内容(排除总例数行) if(length(cols_to_replace) > 0){ t1[-total_row, cols_to_replace] <- "--" } return(t1) } # 示例数据 example <- data.frame(org = c("A", "B", "C", "D", "E", "F", "G"), q1 = c("apple", "apple", NA, "apple", "apple", "apple", NA), q2 = c(NA, NA, NA, "banana", "banana", "banana", NA), q3 = c("orange", NA, "orange", "orange", NA, "orange", NA), region = c("1", "1", "2", "3", "3", "2", "2")) df <- example banner <- list(df$region) # 运行函数 result <- fun1(df, c("q1", "q2", "q3"), banner) print(result)
输出结果
运行后将得到符合需求的表格:
| 1 | 2 | 3 | |
|---|---|---|---|
| apple | -- | -- | -- |
| banana | -- | -- | -- |
| orange | -- | -- | -- |
| #Total cases | 2 | 2 | 2 |
内容的提问来源于stack exchange,提问作者codingr
相关产品推荐
相关产品推荐

