在R中使用sjPlot的plot_grpfrq基于分组变量绘制分面网格图遇错求助
问题分析:sjPlot分组绘制plot_grpfrq报错解决
问题背景
现有包含A、B、C三个变量的数据框,目标是绘制不同B分组下A与C组合的相对频率图。数据集的dput代码如下:
structure(list(B = structure(c(1L, 1L, 3L, 3L, 3L, 2L), .Label = c("text1", "text2", "text3"), class = "factor"), A = structure(c(3L, 4L, 4L, 2L, 2L, 3L), .Label = c("Control_base", "Control_info", "TreatA", "TreatB"), class = "factor"), C = structure(c(1, 0, 2, 3, 2, 3), format.stata = "%9.0g", labels = c(somea = 0, someb = 1, somec = 2, somed = 3), class = c("haven_labelled", "vctrs_vctr", "double"))), row.names = c(NA, -6L), class = c("tbl_df", "tbl", "data.frame"))
尝试通过dplyr分组结合plot_grpfrq绘图时出现报错,代码如下:
data %>% group_by(B) %>% plot_grpfrq( var.cnt = data$A, var.grp = data$C) %>% plot_grid()
报错信息:
Error in match.arg(type) : 'arg' must be NULL or a character vector
但单独调用plot_grpfrq可正常运行:
plot_grpfrq( var.cnt = data$A, var.grp = data$C)
同时,使用plot_frq的分组绘图代码能正常执行:
data %>% group_by(B) %>% plot_frq(C) %>% plot_grid()
data %>% group_by(A) %>% plot_frq(C) %>% plot_grid()
问题原因与解决方案
核心问题
- 在
dplyr分组管道中直接使用data$A和data$C,会绕过分组上下文,传入的是整个数据集的变量而非当前分组的子集,plot_grpfrq的参数逻辑无法处理这种跨分组的变量引用,导致参数解析出错。 - 忽略了
plot_grpfrq本身自带group参数,无需额外用dplyr::group_by实现分组绘图。
正确实现方式
方式1:利用plot_grpfrq自带的group参数
直接指定分组变量B,让函数自动完成分组绘图,再合并图形:
plot_grpfrq( data = data, var.cnt = A, var.grp = C, group = B ) %>% plot_grid()
方式2:基于dplyr分组管道实现
通过group_split拆分数据为分组列表,再逐个调用plot_grpfrq:
data %>% group_split(B) %>% purrr::map(~ plot_grpfrq(data = .x, var.cnt = A, var.grp = C)) %>% plot_grid()
此方法确保每个分组仅传入自身子集,适配plot_grpfrq的参数逻辑。
内容的提问来源于stack exchange,提问作者canIchangethis
相关产品推荐
相关产品推荐

