如何标记具有相同状态的连续句点

时间:2018-01-26 18:40:13

标签: r

我在R中按时间顺序排列了患者状态的长矢量,以及相关患者ID的标签。此向量是数据帧的元素。我想标记患者状态相同的连续数据行。如果状态更改,则还原为其原始值,即三个单独的事件。这与我搜索过duplicatedmatch就足够的大多数情况不同。

一个例子是:

s <- c(0,0,0,1,1,1,0,0,2,1,1,0,0)
id <- c(1,1,1,1,1,1,1,2,2,2,2,2,2)

,所需的输出将是

flag <- c(1,1,1,2,2,2,3,1,2,3,4,4)

flag <- c(1,1,1,2,2,2,3,4,5,6,7,7)

一种不优雅的方法是生成序列:

unlist(tapply(s, id, function(x) cumsum(c(T, x[-1] != rev(rev(x)[-1])))))

有更好的方法吗?

2 个答案:

答案 0 :(得分:1)

我认为您可以使用rleid中的data.table

library(data.table)
rleid(s,id)

输出:

1 1 1 2 2 2 3 4 5 6 6 7 7

或者对于第一个序列:

data.table(s,id)[,rleid(s),id]$V1

输出:

 1 1 1 2 2 2 3 1 2 3 3 4 4

答案 1 :(得分:1)

运行长度编码 - rle()

tapply(s, id, function(x) { v<-rle(x)$length rep(1:length(v), v) })