【问题标题】:Using loops to create multiple crosstables in R使用循环在 R 中创建多个交叉表
【发布时间】:2022-06-14 21:05:43
【问题描述】:

我有一个包含一个主要分类结果变量和多个分类暴露变量的数据集。我想为每个曝光变量生成一系列带有卡方检验的单独交叉表,我想知道是否有办法使用循环来做到这一点。

这基本上是我要完成的工作的长版本:

    ctable(data$x1, data$y, chisq=T, useNA='no')
    ctable(data$x2, data$y, chisq=T, useNA='no')
    ctable(data$x3, data$y, chisq=T, useNA='no')

这是我第一次把它变成循环:

    for(i in c('x1', 'x2', 'x3')){
    ctables <- ctable(data[[i]], data$y, chisq=T, useNA='no')
    }
    ctables

我运行它时没有收到任何错误,但它只返回最后一个变量名的 ctable(在本例中为 x3)。我错过了什么?

注意:我需要专门命名数据框(data$y 而不是只说 y),因为我正在使用包含多个数据框的大型 SQL 数据库。

【问题讨论】:

  • 您在循环的每次迭代中无意中重写了ctables,这就是为什么ctables 只保留最后一个结果

标签: r loops lapply crosstab crosstable


【解决方案1】:

或者,您可以使用包{crosstable},它允许您请求多个变量作为输入。

这是一个使用mtcars 数据集的示例:

library(crosstable)
crosstable(mtcars2, c(am, gear, cyl), by=vs, total=TRUE, 
           test=TRUE, showNA='no', percent_digits=1) %>% 
  as_flextable()

【讨论】:

    【解决方案2】:

    您可以改用lapply():

    ctables <- lapply(c('x1', 'x2', 'x3'), function(i) {
      ctable(data[[i]], data$y, chisq=T, useNA='no', dnn =c(i,"y"))
    })
    

    ** 更新为 dnn=c(i,"y") 以指定显式名称,从而生成 ctable

    【讨论】:

    • 作为后续行动,您知道如何让 x 变量名称出现在 ctables 中吗?现在它只是在 ctable 标题中显示为“data$[[i]] * data$y”,而不是“data$x1 * data$y”。
    • 当然,请参阅我对答案的补充。基本上,您可以在ctable() 中使用dnn 参数
    • 完美,非常感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 2021-11-20
    • 2019-07-01
    • 2017-03-07
    • 2018-07-06
    • 2022-01-22
    • 2016-04-22
    • 1970-01-01
    • 2013-06-29
    相关资源
    最近更新 更多