r - 使用 tabyl 运行多个交叉表
问题描述
我有这样的数据:
dat <- mtcars %>% mutate(cyl2 = cyl*2,cyl3 = cyl*3)
我想使用 tabyl 运行以下每个交叉表 [vs,cyl] [vs,cyl1] [vs,cyl2] [vs,cyl3]:
我知道我可以像这样运行 vs、cyl,并对每个“cyl”变量重复此操作。但是我想形成某种循环而不是重复这个。
dat%>%
tabyl(vs,cyl)%>%
adorn_percentages("row") %>%
adorn_pct_formatting(digits = 2) %>%
adorn_ns()
所以我研究了一个功能:
run_xtable <- function(data,v1) {
out <- data%>%
tabyl(vs,v1)%>%
adorn_percentages("row") %>%
adorn_pct_formatting(digits = 2) %>%
adorn_ns()
return(out)
}
run_xtable(dat,'cyl')
我遇到了一些问题,非常感谢任何帮助!
该函数不接受 v1 作为参考变量。为什么是这样?我尝试将它包装在 enquo 中,但没有任何区别。
.data
错误:必须按在.*中找到的变量分组。v1
未找到列。如何设置它以便我可以使用这样的东西来减少重复:
sapply(run_xtable, c('cyl','cyl1','cyl2'))
谢谢!
解决方案
我们可以将 v1 的输入字符串转换为sym
bol 并评估 ( !!
)
run_xtable <- function(data,v1) {
out <- data%>%
tabyl(vs, !! rlang::sym(v1))%>%
adorn_percentages("row") %>%
adorn_pct_formatting(digits = 2) %>%
adorn_ns()
return(out)
}
-测试
run_xtable(dat,'cyl')
# vs 4 6 8
# 0 5.56% (1) 16.67% (3) 77.78% (14)
# 1 71.43% (10) 28.57% (4) 0.00% (0)
对于多列,遍历列名,即 v1
lapply(c('cyl','cyl2','cyl3'), run_xtable, data = dat)
#[[1]]
# vs 4 6 8
# 0 5.56% (1) 16.67% (3) 77.78% (14)
# 1 71.43% (10) 28.57% (4) 0.00% (0)
#[[2]]
# vs 12 16 8
# 0 16.67% (3) 77.78% (14) 5.56% (1)
# 1 28.57% (4) 0.00% (0) 71.43% (10)
#[[3]]
# vs 12 18 24
# 0 5.56% (1) 16.67% (3) 77.78% (14)
# 1 71.43% (10) 28.57% (4) 0.00% (0)
或者,如果我们想要以列作为标识符的单个数据输出
library(purrr)
library(dplyr)
imap_dfr(lst('cyl','cyl2','cyl3'), ~ run_xtable(data = dat, v1 = .x) %>%
mutate(grp = .y, .before = 1))
推荐阅读
- c# - 如何在 dotnet core 中为 HttpClient 指定 HTTP/2“先验知识”模式?
- json - Swift JSON 撇号'字符串在 Web 服务器上被奇怪地解释
- pandas - 将文件夹中的 *random* csv 文件导入 pandas
- google-api - Google Indexing API - 权限被拒绝。无法验证 URL 所有权
- javascript - 在 React Native JSX 中从 2D 数组渲染项目
- python-3.x - 熊猫 - 比较给定日期范围内的平均小时数
- oozie - oozie 时区如何工作,它没有选择正确的时区?
- assembly - 为什么 sw 的源操作数在其目标操作数之前?
- r - 使用存储变量中的符号名称重命名数据框列?
- gmail-api - OAuth2.0 支持 IMAP - 用于电子邮件别名的 GMAIL API