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

R语言:按数据框中变量连续实例分组计算时长

解决方法

你需要先创建一个连续分组标识,把同一变量的连续实例归为一组,非连续的分开,再按这个标识分组求和。具体代码如下:

# 先把矩阵转成数据框(cbind出来的是字符矩阵,处理数值会有问题)
xd <- data.frame(
  x = c("w", "i", "i", "w", "w", "w", "i"),
  duration = c(3,4,4,2,1,5,6),
  stringsAsFactors = FALSE
)

# 创建连续分组ID:当当前x和前一个x不同时,分组ID+1
xd$group_id <- cumsum(c(TRUE, xd$x[-1] != xd$x[-nrow(xd)]))

# 按分组ID和x分组,计算总时长
xd_result <- aggregate(duration ~ x + group_id, data = xd, sum)

# 整理成你要的格式(可以去掉group_id列)
xd_wanted_outcome <- xd_result[, c("x", "duration")]
colnames(xd_wanted_outcome) <- c("x_group", "duration_group")

# 查看结果
xd_wanted_outcome

运行后输出就是你要的结果:

x_group duration_group
1       w               3
2       i               8
3       w               8
4       i               6

关键步骤解释

  • 把cbind的矩阵转成数据框:因为cbind会把数值型的duration转成字符,后续求和会出错,直接用data.frame创建更稳妥。
  • 创建group_id:cumsum(c(TRUE, xd$x[-1] != xd$x[-nrow(xd)]))的逻辑是:第一个元素默认是新组(TRUE对应1),从第二个元素开始,只要和前一个x不同,就生成一个新的分组ID,这样连续相同的x会被分到同一个group_id里。
  • 如果你习惯用dplyr,也可以这么写:
library(dplyr)

xd_result <- xd %>%
  mutate(group_id = cumsum(c(TRUE, x[-1] != x[-n()]))) %>%
  group_by(group_id, x) %>%
  summarise(duration_group = sum(duration), .groups = "drop") %>%
  select(x_group = x, duration_group)

这样就能精准区分连续的同变量实例,不会把所有相同x的行都归为一组了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 13:44:56