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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 23:51:37