如何用dplyr保留分组后最大value-lead(4)差值的对应两行
解决方法
要保留分组后产生最大差值的当前行和对应的第4个lead行,可以通过给分组内的行添加序号、定位目标行的方式实现,具体步骤如下:
步骤说明
- 分组并按
DateTime排序后,给每行添加分组内的行号row_id,同时计算差值列new_column; - 筛选出每个组中
new_column最大的行,收集这些行的row_id以及对应的lead行的row_id(即row_id + 4); - 通过关联筛选,提取所有目标行的完整数据。
完整代码示例
library(dplyr) # 构造测试数据(可替换为你的实际数据) df <- tibble( group = rep(c("A", "B"), each = 10), DateTime = seq(as.POSIXct("2023-01-01"), by = "hour", length.out = 20), value = c(rnorm(10, 10), rnorm(10, 20)) ) # 处理流程 result <- df %>% # 分组、排序,添加组内行号并计算差值 group_by(group) %>% arrange(DateTime) %>% mutate( row_id = row_number(), new_column = value - lead(value, n = 4L) ) %>% # 筛选出每组中差值最大的行 filter(new_column == max(new_column, na.rm = TRUE)) %>% # 收集需要保留的目标行号:当前行 + 对应的第4个lead行 summarize(target_rows = c(row_id, row_id + 4)) %>% # 关联回原排序后的数据集,筛选目标行 right_join( df %>% group_by(group) %>% arrange(DateTime) %>% mutate(row_id = row_number()), by = c("group", "row_id" = "target_rows") ) %>% # 移除临时行号列(可选) select(-row_id) %>% ungroup() # 查看结果 print(result)
关键细节
- 使用
row_number()生成组内行号,确保能精准定位到lead(value, n=4)对应的行; max(new_column, na.rm = TRUE)会忽略差值为NA的行(即数据末尾不足4行的情况);- 如果同一组内有多个行的差值并列最大,代码会自动保留所有对应的行对。
内容的提问来源于stack exchange,提问作者user11057680
相关产品推荐
相关产品推荐

