在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)
逻辑说明
- 组编号生成:
cumsum(values != lag(values, default = first(values)))会给每一段连续相同的values分配唯一组号,比如前3个1是组0,接下来4个2是组1,以此类推。 - 获取下一组起始行号:按组分组后,
first(row_number())得到当前组的第一行行号,用lead(..., n=1)获取下一个组的第一行行号。 - 计算行间距:用下一组的起始行号减去当前行的行号,得到到首个异值行的距离;最后一组没有下一组,
lead返回NA,对应target为NA。
内容的提问来源于stack exchange,提问作者thuettel
相关产品推荐
相关产品推荐

