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

R语言多列统计1/2出现次数并计算非0值占比

R语言实现方案:统计1/2出现次数及占非0值比例

针对你的需求,这里提供两种实用的实现方案,适配不同的代码风格偏好:

基础R实现

无需额外安装包,用内置函数即可完成计算:

# 定义计算单列指标的函数
calc_col_metrics <- function(column) {
  # 统计1或2的出现次数
  count_12 <- sum(column %in% c(1, 2), na.rm = TRUE)
  # 统计非0值总数
  non_zero_count <- sum(column != 0, na.rm = TRUE)
  # 计算比例,避免除以0的情况
  ratio <- ifelse(non_zero_count == 0, NA, count_12 / non_zero_count)
  
  return(c(count_12 = count_12, ratio = ratio))
}

# 应用到数据框中除Pool外的列(按需调整列范围)
result_df <- as.data.frame(t(apply(df[, -1], 2, calc_col_metrics)))

说明

  • column %in% c(1,2)生成逻辑向量,标记每个元素是否为1或2,sum()直接统计符合条件的数量
  • na.rm = TRUE确保缺失值不会干扰统计结果
  • ifelse判断非0值总数是否为0,避免出现除以0的错误,此时比例返回NA
  • t()转置结果,让每一行对应原数据的一列,输出格式更直观

tidyverse工具集实现

如果习惯使用dplyr+tidyr的管道语法,可采用以下方案:

library(dplyr)
library(tidyr)

result_df <- df %>%
  # 选择需要计算的列,这里排除Pool列,可根据实际需求调整
  select(-Pool) %>%
  # 对每列计算三个指标:1/2次数、非0总数、比例
  summarise(across(everything(), list(
    count_12 = ~sum(.x %in% c(1, 2), na.rm = TRUE),
    non_zero_total = ~sum(.x != 0, na.rm = TRUE),
    ratio = ~{
      n_non_zero <- sum(.x != 0, na.rm = TRUE)
      ifelse(n_non_zero == 0, NA, sum(.x %in% c(1, 2), na.rm = TRUE)/n_non_zero)
    }
  ))) %>%
  # 转换为长格式,拆分列名和指标名
  pivot_longer(everything(), 
               names_to = c("column", "metric"), 
               names_sep = "_",
               values_to = "value") %>%
  # 转换为宽格式,让每个指标作为单独列
  pivot_wider(names_from = metric, values_from = value)

说明

  • across(everything(), ...)批量处理所有列,简化重复代码
  • 匿名函数~{}内部先计算非0值总数,避免重复计算提升效率
  • pivot_longer和pivot_wider将结果整理为更易读的表格格式,每一行对应原数据的一列及对应的两个指标

用你提供的示例数据运行以上代码,得到的结果会符合预期:比如列c的count_12为10,ratio为1.0;列e的count_12为6,non_zero_total为6,ratio为1.0等。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 21:36:21