You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用dplyr创建频率表:统计因子水平、缺失值及变量为1的计数

更优雅的二元变量(1/0/NA)取值1的频率统计方案

嘿,作为流行病学者处理这类二元变量的频率表绝对是日常高频需求!我太懂你觉得用dplyr实现起来比预想复杂的感受了,其实有几个简洁又优雅的实现方式,帮你简化代码:

方法一:dplyr + tidyr 极简批量处理

利用across()批量遍历目标变量,结合sum()直接统计取值为1的数量(自动忽略NA),最后转成长表格式更符合经典频率表的呈现:

library(dplyr)
library(tidyr)

# 假设你的数据集名为 df,目标变量是 var1、var2、var3
freq_table <- df %>%
  # 批量计算每个变量中1的个数
  summarise(across(c(var1, var2, var3), ~sum(.x == 1, na.rm = TRUE))) %>%
  # 把宽表转成长表,更贴近传统频率表结构
  pivot_longer(everything(), 
               names_to = "变量名称", 
               values_to = "取值为1的样本数")

如果你的目标变量是数据集中所有的二元数值变量,还能更灵活——不用手动列变量名,用where(is.numeric)自动筛选:

freq_table <- df %>%
  summarise(across(where(is.numeric), ~sum(.x == 1, na.rm = TRUE))) %>%
  pivot_longer(everything(), names_to = "变量名称", values_to = "取值为1的样本数")

方法二:janitor 包(专为统计表格设计)

janitor包是做流行病学统计表格的神器,tabyl()函数能快速生成频率表,批量处理也很丝滑:

library(janitor)
library(purrr)

# 选择目标变量后批量生成统计结果
freq_table <- df %>%
  select(var1, var2, var3) %>%
  map_dfr(~tabyl(.x) %>% filter(.x == 1) %>% pull(n), 
          .id = "变量名称") %>%
  rename(取值为1的样本数 = value)

方法三:Base R 一行搞定(极致简洁)

如果不想加载额外包,Base R的colSums()就能轻松完成统计,代码极简:

# 直接生成数据框格式的频率表
freq_table <- data.frame(
  变量名称 = c("var1", "var2", "var3"), # 替换为你的变量名
  取值为1的样本数 = colSums(df == 1, na.rm = TRUE)
)

这些方法都比繁琐的逐个变量统计要优雅得多,选最适合你习惯的方式就好~

内容的提问来源于stack exchange,提问作者Luis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:44:46