将索引添加到相等值的运行中,占 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.table
和 cumsum
中的 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
这是我的数据示例:
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.table
和 cumsum
中的 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