首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在R中使用lapply和summarytools::ctable生成多个交叉表

在R中使用lapply和summarytools::ctable生成多个交叉表
EN

Stack Overflow用户
提问于 2021-09-19 17:31:24
回答 1查看 120关注 0票数 0

我有类似于下面调用的NHANES数据的数据。我想做的是循环遍历几个变量的列表来创建交叉表。我想继续使用summarytools::ctable包,因为我想调用chisq参数。但是,我很乐意使用另一种方法,只要chisquare是一个选项,并且我仍然可以删除NAs。

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

代码语言:javascript
代码运行次数:0
运行
复制
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而不是列表中的变量名,这是不理想的。

代码语言:javascript
代码运行次数:0
运行
复制
ctabs2 <- function(i) {
  summarytools::ctable(smk[,i], smk$SMQ020, chisq=T, useNA = "no") 
}

lapply(vars, ctabs2)

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

错误:无法子集不存在的列。X位置%2不存在。ℹ只有1列。

即使列确实存在,因为简单的频率函数工作起来没有问题。看起来就像函数的编写方式一样,ctable不能识别变量。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-09-20 04:47:26

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

代码语言:javascript
代码运行次数:0
运行
复制
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参数。

代码语言:javascript
代码运行次数:0
运行
复制
ctabs2 <- function(i) {
  summarytools::ctable(smk[[i]], smk$SMQ020, chisq=T, useNA = "no", dnn = c(i, 'SMQ020')) 
}

lapply(vars, ctabs2)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69245597

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档