我有一列具有唯一级别的列,我想找到差距(级别之间的差异)。
我有数据
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
答案 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
并使用cumsum
和diff
创建分组变量以捕获唯一级别的差异,并使用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