迭代 R 中交叉表的指定列
Iterate over specified columns for crosstabs in R
我正在寻找 运行 同一数据集中的几十个交叉表,并具有一组结果变量。我有一个函数可以给我想要的交叉表:
second_table = function(dat, variable1, variable2){
dat %>%
tabyl({{variable1}}, {{variable2}}, show_na = FALSE) %>%
adorn_percentages("row") %>%
adorn_pct_formatting(digits = 1) %>%
adorn_ns()
}
以 mtcars 数据集为例,该函数为我提供了我想要的单个变量:
cars = datasets::mtcars
second_table(cars, cyl, vs)
不过,我真正想要的是创建许多这样的表,其中 dat = cars 和 variable2 = vs 参数保持不变,但使用几个不同的列作为 variable1 参数。出于本示例的目的,假设它是以下 4 个变量:
variables = c("cyl", "am", "gear", "carb")
我不确定 purrr 包中的 map 函数是否是执行此操作的最佳方法,但我一直在尝试使用 map 和相关函数(如 map_at)进行各种不同的尝试,但均未成功。
如果有办法用 purrr 做到这一点,那么我更愿意这样做,但我愿意接受任何建议。我真的不在乎输出是什么样子,只是我不需要多次复制和粘贴代码就可以获得我需要的所有交叉表。
非常感谢任何帮助!
由于您的数据集和第二个变量是固定的,您可以像这样简化过程:
library(tidyverse)
library(janitor)
imap(set_names(c("cyl", "am", "gear", "carb")), ~ mtcars %>%
tabyl(!!rlang::sym(.x), vs, show_na = F) %>%
adorn_percentages("row") %>%
adorn_pct_formatting(digits = 1) %>%
adorn_ns()
)
输出
$cyl
cyl 0 1
4 9.1% (1) 90.9% (10)
6 42.9% (3) 57.1% (4)
8 100.0% (14) 0.0% (0)
$am
am 0 1
0 63.2% (12) 36.8% (7)
1 46.2% (6) 53.8% (7)
$gear
gear 0 1
3 80.0% (12) 20.0% (3)
4 16.7% (2) 83.3% (10)
5 80.0% (4) 20.0% (1)
$carb
carb 0 1
1 0.0% (0) 100.0% (7)
2 50.0% (5) 50.0% (5)
3 100.0% (3) 0.0% (0)
4 80.0% (8) 20.0% (2)
6 100.0% (1) 0.0% (0)
8 100.0% (1) 0.0% (0)
我使用 purrr::imap
和 purrr::set_names
(技术上来自 rlang
包)在输出列表中保留变量名称。
如果你想重用你的函数,你必须做一个小改动:
library(rlang)
second_table2 = function(dat, variable1, variable2){
variable1 <- sym(variable1)
dat %>%
tabyl(!!variable1, {{variable2}}, show_na = FALSE) %>%
adorn_percentages("row") %>%
adorn_pct_formatting(digits = 1) %>%
adorn_ns()
}
我检查过它运行良好,可能具有更好的可读性:
R> map(variables, ~second_table2(cars, .x, vs))
[[1]]
cyl 0 1
4 9.1% (1) 90.9% (10)
6 42.9% (3) 57.1% (4)
8 100.0% (14) 0.0% (0)
[[2]]
am 0 1
0 63.2% (12) 36.8% (7)
1 46.2% (6) 53.8% (7)
[[3]]
gear 0 1
3 80.0% (12) 20.0% (3)
4 16.7% (2) 83.3% (10)
5 80.0% (4) 20.0% (1)
[[4]]
carb 0 1
1 0.0% (0) 100.0% (7)
2 50.0% (5) 50.0% (5)
3 100.0% (3) 0.0% (0)
4 80.0% (8) 20.0% (2)
6 100.0% (1) 0.0% (0)
8 100.0% (1) 0.0% (0
当然,您可以使用@LMc 的重要建议来增加信息量。
HTH.
我正在寻找 运行 同一数据集中的几十个交叉表,并具有一组结果变量。我有一个函数可以给我想要的交叉表:
second_table = function(dat, variable1, variable2){
dat %>%
tabyl({{variable1}}, {{variable2}}, show_na = FALSE) %>%
adorn_percentages("row") %>%
adorn_pct_formatting(digits = 1) %>%
adorn_ns()
}
以 mtcars 数据集为例,该函数为我提供了我想要的单个变量:
cars = datasets::mtcars
second_table(cars, cyl, vs)
不过,我真正想要的是创建许多这样的表,其中 dat = cars 和 variable2 = vs 参数保持不变,但使用几个不同的列作为 variable1 参数。出于本示例的目的,假设它是以下 4 个变量:
variables = c("cyl", "am", "gear", "carb")
我不确定 purrr 包中的 map 函数是否是执行此操作的最佳方法,但我一直在尝试使用 map 和相关函数(如 map_at)进行各种不同的尝试,但均未成功。 如果有办法用 purrr 做到这一点,那么我更愿意这样做,但我愿意接受任何建议。我真的不在乎输出是什么样子,只是我不需要多次复制和粘贴代码就可以获得我需要的所有交叉表。
非常感谢任何帮助!
由于您的数据集和第二个变量是固定的,您可以像这样简化过程:
library(tidyverse)
library(janitor)
imap(set_names(c("cyl", "am", "gear", "carb")), ~ mtcars %>%
tabyl(!!rlang::sym(.x), vs, show_na = F) %>%
adorn_percentages("row") %>%
adorn_pct_formatting(digits = 1) %>%
adorn_ns()
)
输出
$cyl
cyl 0 1
4 9.1% (1) 90.9% (10)
6 42.9% (3) 57.1% (4)
8 100.0% (14) 0.0% (0)
$am
am 0 1
0 63.2% (12) 36.8% (7)
1 46.2% (6) 53.8% (7)
$gear
gear 0 1
3 80.0% (12) 20.0% (3)
4 16.7% (2) 83.3% (10)
5 80.0% (4) 20.0% (1)
$carb
carb 0 1
1 0.0% (0) 100.0% (7)
2 50.0% (5) 50.0% (5)
3 100.0% (3) 0.0% (0)
4 80.0% (8) 20.0% (2)
6 100.0% (1) 0.0% (0)
8 100.0% (1) 0.0% (0)
我使用 purrr::imap
和 purrr::set_names
(技术上来自 rlang
包)在输出列表中保留变量名称。
如果你想重用你的函数,你必须做一个小改动:
library(rlang)
second_table2 = function(dat, variable1, variable2){
variable1 <- sym(variable1)
dat %>%
tabyl(!!variable1, {{variable2}}, show_na = FALSE) %>%
adorn_percentages("row") %>%
adorn_pct_formatting(digits = 1) %>%
adorn_ns()
}
我检查过它运行良好,可能具有更好的可读性:
R> map(variables, ~second_table2(cars, .x, vs))
[[1]]
cyl 0 1
4 9.1% (1) 90.9% (10)
6 42.9% (3) 57.1% (4)
8 100.0% (14) 0.0% (0)
[[2]]
am 0 1
0 63.2% (12) 36.8% (7)
1 46.2% (6) 53.8% (7)
[[3]]
gear 0 1
3 80.0% (12) 20.0% (3)
4 16.7% (2) 83.3% (10)
5 80.0% (4) 20.0% (1)
[[4]]
carb 0 1
1 0.0% (0) 100.0% (7)
2 50.0% (5) 50.0% (5)
3 100.0% (3) 0.0% (0)
4 80.0% (8) 20.0% (2)
6 100.0% (1) 0.0% (0)
8 100.0% (1) 0.0% (0
当然,您可以使用@LMc 的重要建议来增加信息量。
HTH.