如何用apply或sapply替代crosstab的row.vars参数生成交叉表
解决crosstab结合apply/sapply的替代实现问题
首先修正你的数据类型转换代码——用apply处理后会把tibble转为矩阵,后续可能引发问题,推荐用dplyr的across来批量转换列类型:
library(dplyr) library(gtsummary) mtcars <- mtcars %>% as_tibble() %>% mutate(across(c(vs, am), as.character))
你之前的apply写法错误在于:直接传入crosstab(mtcars, row.vars = c('vs', 'am'))会立即执行该函数,而非将其作为循环调用的逻辑。正确的做法是用匿名函数循环指定的变量名,将每个变量名传入crosstab的row.vars参数,推荐用sapply或lapply实现:
方法1:用sapply生成命名列表结果
# 定义要生成交叉表的变量向量 target_vars <- c("vs", "am") # 循环生成交叉表,结果为命名列表 cross_tab_list <- sapply(target_vars, function(var) { crosstab(mtcars, row.vars = var) }, simplify = FALSE) # 调用单个结果 cross_tab_list$vs cross_tab_list$am
方法2:用lapply实现(结果为列表,与sapply加simplify=FALSE等价)
cross_tab_list <- lapply(target_vars, function(var) { crosstab(mtcars, row.vars = var) }) # 可手动命名列表 names(cross_tab_list) <- target_vars
核心逻辑是:循环的是变量名而非列数据,通过匿名函数将每个变量名传递给crosstab的row.vars参数,实现与单独调用crosstab(mtcars, row.vars = "vs")和crosstab(mtcars, row.vars = "am")完全一致的效果。
内容的提问来源于stack exchange,提问作者12666727b9
相关产品推荐
相关产品推荐

