R 将索引添加到相等值的运行中,考虑NA
以下是我的数据示例:R 将索引添加到相等值的运行中,考虑NA,r,sequence,run-length-encoding,R,Sequence,Run Length Encoding,以下是我的数据示例: 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 欢迎任何关于如何使其工作的见
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
欢迎任何关于如何使其工作的见解或建议 使用
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
一种可能性:
r=rle(df$dyad)
<代码>r$values[!is.na(r$values)]=沿着(r$values[!is.na(r$values)])的顺序排列df$rid=inverse.rle(r)
谢谢!这和@Henrik在上面的评论中提供的解决方案一样有效。@Ronak Shah,这如何处理多个NA
的运行?例如,对于x=c(“a”,NA,NA,“a”)
,我希望1na-NA-2
。这可能不是OP的问题,我只是在想一个更一般的解决方案。有什么想法吗?干杯。是的,你是对的。它不适用于连续的NA
。我进行了编辑以更新答案。虽然我认为我的解决方案过于复杂,可能有一个更简单的解决方案。
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
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