You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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()

问题原因与解决方案

核心问题

  1. 在dplyr分组管道中直接使用data$A和data$C,会绕过分组上下文,传入的是整个数据集的变量而非当前分组的子集,plot_grpfrq的参数逻辑无法处理这种跨分组的变量引用,导致参数解析出错。
  2. 忽略了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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 08:30:44