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

在dplyr::mutate中计算列内当前行与首个异值行的行间距

问题:计算当前行到首个异值行的行间距

原始数据框:

data <- data.frame(values = c(1,1,1,2,2,2,2,1,1,4))

需求:用dplyr::mutate()创建新列target,计算当前行与第一个值不同的后续行之间的行间距,期望输出:

values target
1       1      3
2       1      2
3       1      1
4       2      4
5       2      3
6       2      2
7       2      1
8       1      2
9       1      1
10      4     NA

已知dplyr::lead()可获取后续指定行的值,但不知道如何在mutate()中实现“找到首个异值行并计算行号差”的逻辑,曾考虑循环lead的n参数比较值,但不知如何在数据框上下文实现。


解决方案

可以通过给连续相同值的组编号,再结合组的起始行号来实现:

library(dplyr)

data <- data.frame(values = c(1,1,1,2,2,2,2,1,1,4))

result <- data %>%
  # 生成连续相同值的组编号:值与前一行不同时累加1
  mutate(group = cumsum(values != lag(values, default = first(values)))) %>%
  # 按组分组,获取下一个组的起始行号
  group_by(group) %>%
  mutate(next_group_start = lead(first(row_number()), n = 1)) %>%
  ungroup() %>%
  # 计算当前行到首个异值行的间距
  mutate(target = next_group_start - row_number()) %>%
  # 保留需要的列
  select(values, target)

print(result)

逻辑说明

  1. 组编号生成:cumsum(values != lag(values, default = first(values)))会给每一段连续相同的values分配唯一组号,比如前3个1是组0,接下来4个2是组1,以此类推。
  2. 获取下一组起始行号:按组分组后,first(row_number())得到当前组的第一行行号,用lead(..., n=1)获取下一个组的第一行行号。
  3. 计算行间距:用下一组的起始行号减去当前行的行号,得到到首个异值行的距离;最后一组没有下一组,lead返回NA,对应target为NA。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 04:44:52