找出唯一级别之间的差异

时间:2018-09-19 14:06:57

标签: r

我有一列具有唯一级别的列,我想找到差距(级别之间的差异)。

我有数据

x=c(0,0,0,0,0,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,4,4) 

其结果应为:

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

4 个答案:

答案 0 :(得分:2)

这不是很清楚的代码,但是可以完成工作:

res = ifelse(x == 0, 0, ifelse(c(0, x[-length(x)]) != 0, 0, NA))
res[is.na(res)] = with(rle(x == 0), lengths[values])
res
# [1] 0 0 0 0 4 0 0 0 0 4 0 0 2 0

这也许更好:

res2 = x
res2[x != 0] = diff(c(0, which(x != 0))) - 1
res2
# [1] 0 0 0 0 4 0 0 0 0 4 0 0 2 0

答案 1 :(得分:2)

不是确切的答案,但她是使用rle的方法...

x=c(0,0,0,0,1,0,0,0,0,2,0,0,3,4)

y <- rle(x)

> y
# Run Length Encoding
# lengths: int [1:7] 4 1 4 1 2 1 1
# values : num [1:7] 0 1 0 2 0 3 4

答案 2 :(得分:1)

我们可以使用ave并使用cumsumdiff创建分组变量以捕获唯一级别的差异,并使用seq_along

创建序列
ave(x, c(0, cumsum(diff(x) != 0)), FUN = seq_along)
#[1] 1 2 3 4 5 1 2 3 1 2 3 4 1 2 3 4 1 2 3 4 5 6

对于给定的示例,如@markus所示,此方法有效

ave(x, x, FUN = seq_along)
#[1] 1 2 3 4 5 1 2 3 1 2 3 4 1 2 3 4 1 2 3 4 5 6

但是如果输入是

怎么办?
x=c(0,0,0,0,0,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,4,4,0,0)

使用

ave(x, x, FUN = seq_along) #gives
#[1] 1 2 3 4 5 1 2 3 1 2 3 4 1 2 3 4 1 2 3 4 5 6 6 7

ave(x, c(0, cumsum(diff(x) != 0)), FUN = seq_along) #gives
#[1] 1 2 3 4 5 1 2 3 1 2 3 4 1 2 3 4 1 2 3 4 5 6 1 2

答案 3 :(得分:0)

我们可以使用rleid中的data.table

library(data.table)
ave(x, rleid(x), FUN = seq_along)
#[1] 1 2 3 4 5 1 2 3 1 2 3 4 1 2 3 4 1 2 3 4 5 6

或转换为data.table,然后按rleid

分组
data.table(x)[, seq_len(.N), x]$V1
#[1] 1 2 3 4 5 1 2 3 1 2 3 4 1 2 3 4 1 2 3 4 5 6

或者在使用rle之后,提取lengths并应用sequence

sequence(rle(x)$lengths)
#[1] 1 2 3 4 5 1 2 3 1 2 3 4 1 2 3 4 1 2 3 4 5 6