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.5object=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
相关产品推荐
相关产品推荐

