如何批量统计多变量的1值频数与占比并生成DataFrame?
高效统计0-1变量的频数与占比方法
你的原始数据集代码:
id <- c(1001, 1002, 1003, 1004, 1005, 1006) var1 <- c(1, 0, 1, 0, 1, 1) var2 <- c(1, 1, 1, 1, 1, 0) var3 <- c(0, 0, 1, 1, 1, 0) file <- data.frame(id, var1, var2, var3)
以下两种方法可批量处理任意数量的0-1变量,无需手动逐个统计:
方法一:用tidyverse工具包(简洁易读,推荐)
先安装并加载tidyverse,通过数据转置+分组统计完成需求:
library(tidyverse) result <- file %>% # 排除id列,将宽格式数据转为长格式 pivot_longer(cols = -id, names_to = "variable", values_to = "response") %>% # 只保留值为1的记录 filter(response == 1) %>% # 按变量和响应值分组统计频数 group_by(variable, response) %>% summarise(count = n(), .groups = "drop") %>% # 计算占比并保留两位小数 mutate(percent = round(count / nrow(file) * 100, 2)) print(result)
输出结果:
# A tibble: 3 × 4 variable response count percent <chr> <dbl> <int> <dbl> 1 var1 1 4 66.7 2 var2 1 5 83.3 3 var3 1 3 50
方法二:基础R实现(无需额外安装包)
通过遍历变量列,批量计算后合并结果:
# 提取所有非id的变量列名 target_vars <- setdiff(names(file), "id") # 遍历每个变量,统计1的频数与占比 stats_result <- lapply(target_vars, function(var_name) { count_1 <- sum(file[[var_name]] == 1) percent_1 <- round(count_1 / nrow(file) * 100, 2) data.frame(variable = var_name, response = 1, count = count_1, percent = percent_1) }) # 将列表合并为最终DataFrame final_result <- do.call(rbind, stats_result) print(final_result)
输出结果:
variable response count percent 1 var1 1 4 66.67 2 var2 1 5 83.33 3 var3 1 3 50.00
内容的提问来源于stack exchange,提问作者Eric Boorman
相关产品推荐
相关产品推荐

