Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 将索引添加到相等值的运行中,考虑NA_R_Sequence_Run Length Encoding - Fatal编程技术网

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