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

如何在R中批量统计数据框各变量的0、1值数量并生成汇总表

高效批量统计R数据框中0/1值的方法

嘿,作为R新手能想到用table函数处理单个变量已经很棒啦!针对你要批量处理6个数据框(每个32个变量)的需求,我给你几个简洁高效的方案,不用写复杂循环就能搞定:

一、先搞定单个数据框的统计

首先我们先实现单个数据框的0/1统计,再扩展到批量处理。这里有两种常用方法:

方法1:用基础R的sapply函数(无需额外安装包)

我们可以写一个自定义函数,用sapply遍历数据框的每个变量,分别统计0和1的数量,最后整理成目标格式:

# 定义统计0/1的函数
count_01 <- function(df) {
  # 统计每个变量中0的数量
  zero_counts <- sapply(df, function(x) sum(x == 0))
  # 统计每个变量中1的数量(也可以用sum(x),因为1为TRUE,0为FALSE)
  one_counts <- sapply(df, function(x) sum(x == 1))
  # 组合成结果数据框
  result_df <- data.frame(Zeroes = zero_counts, Ones = one_counts)
  return(result_df)
}

# 测试你的示例数据
cluster <- data.frame(sex = c(1,1,1,1,0), mut = c(0,0,0,0,0), ht = c(1,1,0,1,0), wt = c(0,1,1,0,1), group = c(1,0,0,0,0))
count_01(cluster)

运行后就会得到你想要的输出:

Zeroes Ones
sex         1    4
mut         5    0
ht          2    3
wt          2    3
group       4    1

方法2:用tidyverse工具包(更直观的“数据重塑”思路)

如果你习惯用tidyverse系列包(dplyr+tidyr),可以用数据重塑的方式实现,代码可读性更强:

library(tidyverse)

cluster %>%
  # 把宽格式转成长格式,方便统计
  pivot_longer(cols = everything(), names_to = "Variable", values_to = "Value") %>%
  # 按变量和值分组计数
  count(Variable, Value) %>%
  # 把长格式转回宽格式,匹配目标输出
  pivot_wider(names_from = Value, values_from = n, names_prefix = "Count_") %>%
  # 重命名列名
  rename(Zeroes = Count_0, Ones = Count_1)

这个方法同样能得到完全一致的结果,而且如果后续需要处理其他类别值,修改起来更灵活。

二、批量处理多个数据框

现在你有6个数据框,我们可以把它们放进一个列表,用lapply批量处理,一步搞定所有统计:

步骤1:把所有数据框存入列表

假设你的6个数据框分别叫df1、df2、df3、df4、df5、df6,先把它们放进一个命名列表里:

# 创建数据框列表(名字可以自定义,方便后续区分)
df_list <- list(
  data_frame_1 = df1,
  data_frame_2 = df2,
  data_frame_3 = df3,
  data_frame_4 = df4,
  data_frame_5 = df5,
  data_frame_6 = df6
)

步骤2:批量统计并整理结果

用lapply遍历列表中的每个数据框,调用之前写的count_01函数:

# 批量处理,得到每个数据框的统计结果列表
all_results <- lapply(df_list, count_01)

# (可选)把所有结果合并成一个大的数据框,方便查看
library(dplyr)
combined_results <- bind_rows(all_results, .id = "Dataframe_Name")

combined_results会包含所有数据框的统计结果,并且新增一列Dataframe_Name标记每个结果属于哪个原数据框。

额外小提示:增加健壮性(可选)

如果担心有些变量可能包含非0/1的值,可以在函数里加个检查,自动跳过不符合要求的变量并给出提示:

count_01 <- function(df) {
  # 检查每个变量是否仅包含0和1
  valid_vars <- sapply(df, function(x) all(x %in% c(0, 1)))
  
  if (any(!valid_vars)) {
    warning(paste("以下变量包含非0/1值,已跳过:", paste(names(df)[!valid_vars], collapse = ", ")))
    df <- df[, valid_vars, drop = FALSE]
  }
  
  zero_counts <- sapply(df, function(x) sum(x == 0))
  one_counts <- sapply(df, function(x) sum(x == 1))
  result_df <- data.frame(Zeroes = zero_counts, Ones = one_counts)
  return(result_df)
}

试试这些方法,应该能帮你快速完成批量统计任务!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:38:34