重新排序向量中的运行计数

时间:2017-04-25 14:43:38

标签: r vector

我试图找出是否有办法做到这一点并不需要for循环。

我有一个数据向量按顺序增加,但跳过偶尔的值。例如,测试

num[1:4651] 2 2 2 2 3 3 3 3 3 3 7 7 9 9 9 9, etc.

是否有一个R函数将该向量转换为从1开始到向量结束的固定序列?所以,

1 1 1 1 2 2 2 2 3 3 4 4 4 4, etc. 

2 个答案:

答案 0 :(得分:4)

我们可以使用match来执行此操作

match(test, unique(test))
#[1] 1 1 1 1 2 2 2 2 2 2 3 3 4 4 4 4

或另一个选项是factor

as.integer(factor(test, levels = unique(test)))
#[1] 1 1 1 1 2 2 2 2 2 2 3 3 4 4 4 4

正如@Frank建议的那样,来自dense_rank的{​​{1}}也可能会随着值的增加而起作用

dplyr

如果值不再重复,可以使用dplyr::dense_rank(test) #[1] 1 1 1 1 2 2 2 2 2 2 3 3 4 4 4 4

rleid

使用data.table::rleid(test) #[1] 1 1 1 1 2 2 2 2 2 2 3 3 4 4 4 4

base R选项
rle

或另一种选择是

inverse.rle(within.list(rle(test), values <- seq_along(values)))
#[1] 1 1 1 1 2 2 2 2 2 2 3 3 4 4 4 4

cumsum(c(TRUE, test[-1] != test[-length(test)])) #[1] 1 1 1 1 2 2 2 2 2 2 3 3 4 4 4 4

中的lag
dplyr

数据

cumsum(test != lag(test, default = TRUE))
#[1] 1 1 1 1 2 2 2 2 2 2 3 3 4 4 4 4

答案 1 :(得分:3)

在基地R中使用rlerep,其中vec是您的向量:

with(rle(vec), rep(seq_along(lengths), times = lengths))