将索引添加到相等值的运行中,占 NA

Add index to runs of equal values, accounting for NA

这是我的数据示例:

df <- data.frame(dyad = c("a", "a", "b", NA, "c", NA, "c", "b"))
df
#   dyad
# 1    a
# 2    a
# 3    b
# 4 <NA>
# 5    c
# 6 <NA>
# 7    c
# 8    b

我想为相同的 dyad 的连续运行创建一个索引。

注 1:dyad 可能会在整个数据框中重复出现,但如果与 dyad 相同的前几行不连续,则应始终具有新的唯一标签。例如。第 3 行和第 8 行的“b”应该有不同的 ID。

注2:NA前后相同的dyad应该有不同的id。例如。最后一个 NA 前后的“c”应该有不同的 id。

因此,预期的结果是:

#   dyad event
# 1    a     1
# 2    a     1
# 3    b     2
# 4 <NA>    NA
# 5    c     3
# 6 <NA>    NA
# 7    c     4
# 8    b     5

欢迎任何关于如何让它发挥作用的见解或建议!

使用 data.tablecumsum 中的 rleid

library(data.table)

df$event <- rleid(df$dyad) - cumsum(is.na(df$dyad))
df$event[is.na(df$dyad)] <- NA
df

#  dyad event
#1    a     1
#2    a     1
#3    b     2
#4 <NA>    NA
#5    c     3
#6 <NA>    NA
#7    c     4
#8    b     5

当你有连续的 NA 时,上面的解决方案不起作用,在这种情况下我们可以使用:

x = c("a", NA, NA, "a", "b", "b", "c", NA)
y <- cumsum(!duplicated(rleid(x)) & !is.na(x))
y[is.na(x)] <- NA
y
#[1]  1 NA NA  2  3  3  4 NA