我在R中按时间顺序排列了患者状态的长矢量,以及相关患者ID的标签。此向量是数据帧的元素。我想标记患者状态相同的连续数据行。如果状态更改,则还原为其原始值,即三个单独的事件。这与我搜索过duplicated
或match
就足够的大多数情况不同。
一个例子是:
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])))))
有更好的方法吗?
答案 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)
})