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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 01:27:00