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的错误,此时比例返回NAt()转置结果,让每一行对应原数据的一列,输出格式更直观
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
相关产品推荐
相关产品推荐

