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

如何基于含activity和time列的tibble生成带起止时间的新tibble

解法

你可以借助dplyr的连续分组能力实现需求,核心逻辑是先给每一段连续的相同活动分配唯一分组,再按组提取起止时间:

代码实现

适配dplyr 1.1.0及以上版本的简洁写法:

library(dplyr)

result <- tbl %>%
  # 为连续出现的相同activity分配唯一分组ID
  group_by(activity, grp = consecutive_id(activity)) %>%
  # 按组汇总提取起止时间
  summarise(
    start_time = first(time),
    end_time = last(time),
    .groups = "drop"
  ) %>%
  # 移除辅助分组列
  select(-grp)

如果你使用的是旧版本dplyr,可以用下面的兼容写法:

library(dplyr)

result <- tbl %>%
  # 手动生成连续活动分组ID
  mutate(grp = cumsum(activity != lag(activity, default = first(activity)))) %>%
  group_by(activity, grp) %>%
  summarise(
    start_time = first(time),
    end_time = last(time),
    .groups = "drop"
  ) %>%
  select(-grp)

效果示例

假设你生成的原始tbl如下:

# A tibble: 12 × 2
    time activity
   <int> <chr>   
 1     3 A       
 2     7 A       
 3    12 B       
 4    18 B       
 5    22 C       
 6    29 C       
 7    35 B       
 8    41 B       
 9    47 A       
10    53 A       
11    68 C       
12    75 C  

运行代码后输出的结果:

# A tibble: 6 × 3
  activity start_time end_time
  <chr>         <int>    <int>
1 A                 3        7
2 B                12       18
3 C                22       29
4 B                35       41
5 A                47       53
6 C                68       75

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 05:36:10