【问题标题】:Generating multiple crosstabs with lapply and summarytools::ctable in R在 R 中使用 lapply 和 summarytools::ctable 生成多个交叉表
【发布时间】:2021-11-13 15:22:33
【问题描述】:

我的数据类似于我在下面调用的 NHANES 数据。我想做的是循环几个变量的列表来创建交叉表。我想坚持使用 summarytools::ctable 包,因为我想调用 chisq 参数。但是,很高兴使用另一种方法,只要可以选择卡方并且我仍然可以删除 NA。

到目前为止,这是有效的。我可以使用下面的函数来生成简单的频率。但是,我想在频率表之前打印变量的名称。该函数首先打印所有变量名,然后继续生成频率,这就是我正在努力解决的问题#1:

library(RNHANES)
library(summarytools)

smk <- nhanes_load_data("SMQ_H", "2013-2014")

vars <- c("SMQ040", "SMD093")

ctabs <- function(i) {
  print(i)
  summarytools::freq(smk[,i]) 
}

lapply(vars, ctabs)

下一个问题是将其扩展到 ctable。该函数有效,但打印 smk[,i] 而不是列表中的变量名,这并不理想。

ctabs2 <- function(i) {
  summarytools::ctable(smk[,i], smk$SMQ020, chisq=T, useNA = "no") 
}

lapply(vars, ctabs2)

嗯,实际上,当我用自己的数据尝试时,我收到了错误消息:

错误:无法对不存在的列进行子集化。 x 位置 2 不存在。 ℹ 只有 1 列。

即使列确实存在,因为简单的频率函数可以正常工作。看起来好像函数的编写方式,ctable无法识别变量。

【问题讨论】:

    标签: r lapply crosstab summarytools


    【解决方案1】:

    要解决第一个问题,请使用for 循环。

    vars <- c("SMQ040", "SMD093")
    
    ctabs <- function(i) {
      print(i)
      summarytools::freq(smk[,i]) 
    }
    
    result <- vector('list', length(vars))
    for(i in seq_along(vars)) {
      result[[i]] <- ctabs(vars[i])
      print(result[[i]])
    }
    
    #[1] "SMQ040"
    #Frequencies  
    
    #              Freq   % Valid   % Valid Cum.   % Total   % Total Cum.
    #----------- ------ --------- -------------- --------- --------------
    #          1    992     38.46          38.46     13.84          13.84
    #          2    240      9.31          47.77      3.35          17.19
    #          3   1347     52.23         100.00     18.79          35.98
    #       <NA>   4589                              64.02         100.00
    #      Total   7168    100.00         100.00    100.00         100.00
    #[1] "SMD093"
    #Frequencies  
    
    #              Freq   % Valid   % Valid Cum.   % Total   % Total Cum.
    #----------- ------ --------- -------------- --------- --------------
    #          1    829     67.29          67.29     11.57          11.57
    #          2    280     22.73          90.02      3.91          15.47
    #          3     69      5.60          95.62      0.96          16.43
    #          4     54      4.38         100.00      0.75          17.19
    #       <NA>   5936                              82.81         100.00
    #      Total   7168    100.00         100.00    100.00         100.00
    

    第二个使用ctable函数的dnn参数。

    ctabs2 <- function(i) {
      summarytools::ctable(smk[[i]], smk$SMQ020, chisq=T, useNA = "no", dnn = c(i, 'SMQ020')) 
    }
    
    lapply(vars, ctabs2)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-05-14
      • 2017-03-09
      • 2021-11-08
      • 2022-06-14
      • 1970-01-01
      • 2021-12-05
      • 2012-11-06
      相关资源
      最近更新 更多