我试图找出是否有办法做到这一点并不需要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.
答案 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中使用rle
和rep
,其中vec
是您的向量:
with(rle(vec), rep(seq_along(lengths), times = lengths))