R语言中如何统计多列指定值出现次数?解决summarise_all报错
统计多列中指定值的出现次数
问题描述
现有如下数据集:
ID Col_01 Col_02 Col_03 Col_04 Col_05 Col_06 1 1 2 1 3 4 -9 2 1 1 2 1 2 2 3 2 4 1 1 1 1 4 3 1 3 2 -9 4 5 2 3 4 4 3 2
需要生成汇总数据集,统计Col_01至Col_06每列中1、2、3、4、-9的出现次数,目标格式如下:
Values Col_01 Col_02 Col_03 Col_04 Col_05 Col_06 1 2 2 2 2 1 1 2 2 1 1 1 1 2 3 1 1 1 1 1 0 4 0 1 1 1 1 1 -9 0 0 0 0 1 1
尝试了以下代码但报错:
df %>% select(matches("^Col_\\d+$")) %>% summarise_all(funs(table))
报错信息:Col_05 must be of size 4 or 1 , not 5,伴随其他警告。
错误原因
summarise_all(funs(table))会对每列独立生成频数统计,但不同列包含的取值类别数量不一致(比如Col_01没有-9和4,返回的table长度为3;而Col_05包含所有5个取值,返回的table长度为5)。summarise要求所有列的汇总结果长度相同,因此触发报错。
解决方案
方法1:使用tidyverse的长格式转换(推荐)
通过将数据转为长格式统一计数,再转回宽格式并填充缺失值为0,确保所有指定取值都被统计:
library(tidyverse) # 模拟数据集(如果已有df可跳过此步) df <- tibble( ID = 1:5, Col_01 = c(1,1,2,3,2), Col_02 = c(2,1,4,1,3), Col_03 = c(1,2,1,3,4), Col_04 = c(3,1,1,2,4), Col_05 = c(4,2,1,-9,3), Col_06 = c(-9,2,1,4,2) ) # 生成汇总表 df %>% select(starts_with("Col_")) %>% # 筛选所有Col开头的列 pivot_longer(everything(), names_to = "Column", values_to = "Values") %>% # 转为长格式 count(Column, Values) %>% # 按列和取值统计次数 pivot_wider(names_from = Column, values_from = n, values_fill = 0) %>% # 转回宽格式,缺失值填0 arrange(factor(Values, levels = c(1,2,3,4,-9))) # 按指定顺序排序取值
方法2:使用因子统一取值水平
通过将每列转换为包含所有目标取值的因子,确保table返回的结果长度一致:
# 定义需要统计的所有取值 target_values <- c(1,2,3,4,-9) # 筛选目标列 col_data <- df %>% select(starts_with("Col_")) # 对每列统计频数 count_result <- lapply(col_data, function(col) { table(factor(col, levels = target_values)) }) # 转换为数据框并整理格式 result_df <- as.data.frame(do.call(cbind, count_result)) result_df$Values <- target_values result_df <- result_df %>% select(Values, everything()) # 查看结果 print(result_df)
两种方法都能生成符合要求的汇总表,方法1更符合tidyverse的操作逻辑,可读性更强。
内容的提问来源于stack exchange,提问作者Ahir Bhairav Orai
相关产品推荐
相关产品推荐

