【问题标题】:Iterate over specified columns for crosstabs in R迭代 R 中交叉表的指定列
【发布时间】:2021-06-20 08:08:36
【问题描述】:

我希望在同一个数据集中运行几十个交叉表,并设置一个结果变量。我有一个函数可以提供我想要的交叉表:

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_at)进行各种不同的操作,但均未成功。 如果有办法用 purrr 做到这一点,那么这就是我更愿意做的事情,但我愿意接受任何建议。我真的不在乎输出是什么样子,我只需要无需多次复制和粘贴代码即可获得所需的所有交叉表。

非常感谢任何帮助!

【问题讨论】:

  • 我猜这最多只能使用 3 个变量,即根据 ?tabyl Specify a data.frame and the one, two, or three unquoted column names you want to tabulate. Three variables generates a list of 2-way tabyls, split by the third variable.。所以,如果你有超过 3 个,可以使用 ftableftable(cars[variables])
  • 接受的答案更多的是我正在寻找的,但我不知道 ftable 函数!
  • 我不确定您是否需要单独或一起执行此操作

标签: r purrr janitor


【解决方案1】:

由于您的数据集和第二个变量是固定的,您可以像这样简化流程:

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::imappurrr::set_names(技术上来自rlang 包)将变量名保留在输出列表中。

【讨论】:

  • 这正是我想要的——谢谢。感谢您解释 set_names 在做什么!
【解决方案2】:

如果你想重用你的函数,你必须做一个小改动:

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。

【讨论】:

  • 感谢您的回答,看看我如何使用我的原始功能真的很有用!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-12
  • 2019-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多