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

R语言:按object分组统计positive列中1的连续出现次数并计算最值均值

R语言实现按组统计连续1的最大/平均次数

问题描述

现有如下R语言DataFrame:

frame object  positive     
1     6       0    
2     6       1    
3     6       1    
4     6       1    
5     6       1      
6     6       0    
7     6       0    
8     6       1 
9     6       1   
10    6       1
1     7       1    
2     7       1   
3     7       1    
4     7       1   
5     7       1      
6     7       0    
7     7       1       
8     7       0    
9     7       1    
10    7       1

需按object字段分组,统计positive列中值为1的连续出现次数,最终生成包含每组最大连续次数、平均连续次数的新表,预期输出:

object  max  mean 
6       4    3.5
7       5    8/3

实现方法

可以结合dplyr做分组计算,用data.table的rleid函数快速识别连续相同值的分组(也可手动实现分组逻辑,无需额外包)。

方案1:使用dplyr + data.table(简洁高效)

# 加载依赖包
library(dplyr)
library(data.table)

# 构造示例数据(已有数据可跳过此步)
df <- data.frame(
  frame = c(1:10, 1:10),
  object = rep(c(6,7), each=10),
  positive = c(0,1,1,1,1,0,0,1,1,1,1,1,1,1,1,0,1,0,1,1)
)

# 核心计算逻辑
result <- df %>%
  # 按object分组,生成连续相同positive的分组ID
  group_by(object) %>%
  mutate(grp = rleid(positive)) %>%
  ungroup() %>%
  # 仅保留positive=1的行
  filter(positive == 1) %>%
  # 统计每个连续1组的长度
  group_by(object, grp) %>%
  summarise(run_length = n(), .groups = "drop_last") %>%
  # 按object聚合,计算最大和平均连续次数
  summarise(
    max = max(run_length),
    # 若需保留分数格式,用MASS包的fractions函数:mean = fractions(mean(run_length))
    mean = mean(run_length)
  )

# 查看结果
print(result)

方案2:纯dplyr实现(无额外包依赖)

如果不想引入data.table,可手动生成连续分组ID:

library(dplyr)

# 构造示例数据(已有数据可跳过)
df <- data.frame(
  frame = c(1:10, 1:10),
  object = rep(c(6,7), each=10),
  positive = c(0,1,1,1,1,0,0,1,1,1,1,1,1,1,1,0,1,0,1,1)
)

# 核心计算逻辑
result <- df %>%
  group_by(object) %>%
  mutate(
    # 当当前行positive与上一行不同时,生成新分组标记
    grp = cumsum(positive != lag(positive, default = -1))
  ) %>%
  ungroup() %>%
  filter(positive == 1) %>%
  group_by(object, grp) %>%
  summarise(run_length = n(), .groups = "drop_last") %>%
  summarise(
    max = max(run_length),
    mean = mean(run_length)
  )

print(result)

结果说明

  • object=6的连续1组有2个:长度4和3,因此max=4,mean=(4+3)/2=3.5
  • object=7的连续1组有3个:长度5、1、2,因此max=5,mean=(5+1+2)/3=8/3

若需要保留分数格式的均值,需加载MASS包,将mean列替换为mean = fractions(mean(run_length))即可。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 00:27:19