如何基于含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
相关产品推荐
相关产品推荐

