首页 > 解决方案 > 如果两个值相等,则将下一行中的值加 1

问题描述

我有这样的数据

    structure(list(id = c(1, 1, 1, 2, 2, 2), time = c(1, 2, 2, 5, 
6, 6)), class = "data.frame", row.names = c(NA, -6L))

如果对于相同的 ID,下一行中的值等于上一行中的值,则将副本的值增加 1。我想得到这个

    structure(list(id2 = c(1, 1, 1, 2, 2, 2), time2 = c(1, 2, 3, 
5, 6, 7)), class = "data.frame", row.names = c(NA, -6L))

标签: r

解决方案


使用基础 R:

ave(df$time, df$time, FUN = function(z) z+cumsum(duplicated(z)))
# [1] 1 2 3 5 6 7

(这可以重新分配回time。)

这处理2 个或更多重复项,这意味着如果我们有另一个第 6 行,

df <- rbind(df, df[6,])
df$time2 <- ave(df$time, df$time, FUN = function(z) z+cumsum(duplicated(z)))
df
#    id time time2
# 1   1    1     1
# 2   1    2     2
# 3   1    2     3
# 4   2    5     5
# 5   2    6     6
# 6   2    6     7
# 61  2    6     8

推荐阅读