在 R 中使用 lapply 和 summarytools::ctable 生成多个交叉表
Generating multiple crosstabs with lapply and summarytools::ctable in R
我有类似于下面调用的 NHANES 数据的数据。我想做的是遍历几个变量的列表来创建交叉表。我想坚持使用 summarytools::ctable 包,因为我想调用 chisq 参数。然而,很高兴使用另一种方法,只要 chisquare 是一个选项并且我仍然可以删除 NAs。
这是目前有效的方法。我能够使用下面的函数生成简单的频率。但是,我希望在频率 table 之前打印变量的名称。该函数首先打印所有变量名,然后继续生成频率,这是我正在努力解决的问题 #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 不识别变量。
要解决第一个问题,请使用 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)
我有类似于下面调用的 NHANES 数据的数据。我想做的是遍历几个变量的列表来创建交叉表。我想坚持使用 summarytools::ctable 包,因为我想调用 chisq 参数。然而,很高兴使用另一种方法,只要 chisquare 是一个选项并且我仍然可以删除 NAs。
这是目前有效的方法。我能够使用下面的函数生成简单的频率。但是,我希望在频率 table 之前打印变量的名称。该函数首先打印所有变量名,然后继续生成频率,这是我正在努力解决的问题 #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 不识别变量。
要解决第一个问题,请使用 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)