R语言expss封装多响应交叉表函数传参报错解决
expss多选题交叉表自定义函数报错解决
正常运行的基础代码
用expss制作同时展示频数、占比的多选题交叉表,直接运行以下代码就能得到符合预期的结果:
library(expss) set.seed(1998) expss_output_viewer() # 构造示例数据集 x <- c("A","B","C") area <- rep(x,each = 10) p <- sample(c(0,1),30,replace = T) q <- sample(c(0,1),30,replace = T) r <- sample(c(0,1),30,replace = T) mrdata <- data.frame(area,p,q,r) # 生成交叉表 mrdata %>% tab_significance_options(keep = "none", sig_labels = NULL, subtable_marks = "greater", mode = "append") %>% tab_cols(total(), mdset(p,q,r)) %>% tab_cells(area) %>% tab_stat_cases(label = "cases") %>% tab_stat_cpct_responses(label = "%",total_row_position = "none") %>% tab_pivot(stat_position = "inside_columns") %>% set_caption("Table 1")
初始封装的报错问题
单张表的代码量偏大,把制表逻辑封装成自定义函数可以精简代码、提升制表效率,最初的封装写法如下:
mrtable <- function(input,rowvar,colvars,capt ="Table 1") { input %>% tab_significance_options(keep = "none", sig_labels = NULL, subtable_marks = "greater", mode = "append") %>% tab_cols(total(), mdset(colvars)) %>% tab_cells(rowvar) %>% tab_stat_cases(label = "cases") %>% tab_stat_cpct_responses(label = "%",total_row_position = "none") %>% tab_pivot(stat_position = "inside_columns") %>% set_caption(capt) } mrtable(input = mrdata,colvars = c(p,q,r),rowvar = area)
运行上述代码会返回报错:
Error: 'cro': all variables should be of the same length or length 1.
报错原因
expss的mdset()函数要求直接传入多个独立的多选二分变量作为参数,不支持传入用c()合并后的单向量参数。初始封装时把p、q、r三个多选变量用c()拼接成单个对象传给mdset(colvars),函数无法正确拆分识别每个独立变量,做变量长度校验时就会触发上述报错。
可行的封装方案
用R的...动态参数透传多个多选变量,不需要提前合并变量,直接把传入的动态参数交给mdset()处理即可正常运行,代码如下:
mrtable <- function(input,rowvar,...,capt ="Table 1") { input %>% tab_significance_options(keep = "none", sig_labels = NULL, subtable_marks = "greater", mode = "append") %>% tab_cols(total(), mdset(...)) %>% tab_cells(rowvar) %>% tab_stat_cases(label = "cases") %>% tab_stat_cpct_responses(label = "%",total_row_position = "none") %>% tab_pivot(stat_position = "inside_columns") %>% set_caption(capt) } # 函数调用示例 mrtable(input = mrdata,rowvar = area,p,q,r,capt = "Tab")
内容的提问来源于stack exchange,提问作者Ahmad Noman Alnoor
相关产品推荐
相关产品推荐

