R语言:如何统计除id外各因子变量的类别频数并生成目标表格
解决方案
首先你需要修正第一步的NA替换操作(原代码未将替换结果赋值回df3,导致替换未生效),之后可以通过以下两种方式生成目标统计表格:
方法一:使用dplyr + purrr
library(dplyr) library(purrr) library(tibble) # 原始数据 df3 <- data.frame( id = c(1,2,3,4,5,6,7), ibd = c(0,1,1,0,0,1,1), ihd = c(1,1,0,NA,0,0,1), psoriasis = c(0,0,NA,0,0,1,1), mi = c(1,0,0,0,0,NA,1) ) # 替换NA为2并赋值回df3 df3 <- df3 %>% replace(is.na(.), 2) # 将id以外的变量转为因子 df3 <- df3 %>% mutate(across(-id, as.factor)) # 生成统计表格 df5 <- df3 %>% select(-id) %>% # 对每个变量统计频数,保留变量名作为新列 map_dfr(table, .id = "variable") %>% # 转为宽表结构 pivot_wider(names_from = variable, values_from = n) %>% # 添加行标识,对应0、1、NA的计数 mutate(id = case_when( .row == 1 ~ "0s", .row == 2 ~ "1s", .row == 3 ~ "NAs" )) %>% # 调整列顺序,移除临时的.row列 select(id, everything(), -.row) # 输出结果 df5
方法二:使用sapply + 基础数据框操作
library(dplyr) library(tibble) # 原始数据与预处理步骤同上 df3 <- data.frame( id = c(1,2,3,4,5,6,7), ibd = c(0,1,1,0,0,1,1), ihd = c(1,1,0,NA,0,0,1), psoriasis = c(0,0,NA,0,0,1,1), mi = c(1,0,0,0,0,NA,1) ) df3 <- df3 %>% replace(is.na(.), 2) df3 <- df3 %>% mutate(across(-id, as.factor)) # 批量统计频数并转换格式 freq_table <- df3 %>% select(-id) %>% sapply(table) %>% as.data.frame.matrix() # 重命名行标识并调整结构 df5 <- freq_table %>% rownames_to_column("id") %>% mutate(id = recode(id, "0" = "0s", "1" = "1s", "2" = "NAs")) %>% select(id, ibd, ihd, psoriasis, mi) # 输出结果 df5
两种方法最终都会生成你需要的df5表格结构,统计每个变量的0、1、NA(已替换为2)的出现次数。
内容的提问来源于stack exchange,提问作者joejoe9
相关产品推荐
相关产品推荐

