R语言如何统计DataFrame每行的总零数与前导零数量
实现思路与代码示例
先修正总零值统计逻辑
你之前的代码会把非数值的key列也纳入统计,需要先排除key列再计算:
# 仅统计Obs开头的观测列的零值总数 TotalZeros = rowSums(df[, -1] == 0)
前导零计算实现
基础R实现
用apply()函数按行遍历观测列,对每行的数值向量调用你已经知道的min(which(vec != 0))逻辑,结果减1就是第一个非零值之前的零的个数:
# 逐行计算前导零 LeadingZeros <- apply(df[, -1], MARGIN = 1, function(vec) { # 处理全零行的特殊情况,避免返回Inf if (all(vec == 0)) return(length(vec)) min(which(vec != 0)) - 1 }) # 合并生成最终数据框 result <- data.frame( key = df$key, TotalZeros = rowSums(df[, -1] == 0), LeadingZeros = LeadingZeros )
运行后输出的result和你期望的结果完全一致:
key TotalZeros LeadingZeros 1 10A 3 1 2 11xy 1 0 3 445pe 3 2
tidyverse实现(可选)
如果你习惯用tidyverse的语法,也可以用rowwise() + c_across()实现逐行计算:
library(dplyr) result <- df %>% rowwise() %>% summarise( key = key, TotalZeros = sum(c_across(starts_with("Obs")) == 0), LeadingZeros = { vec <- c_across(starts_with("Obs")) if (all(vec == 0)) length(vec) else min(which(vec != 0)) - 1 } ) %>% ungroup()
内容的提问来源于stack exchange,提问作者Sanoj
相关产品推荐
相关产品推荐

