我正在尝试找出是否有一种方法可以做到这一点而不需要for循环。
我有一个数据向量,它会按顺序增加,但会跳过偶尔的值。例如,test
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. 发布于 2017-04-25 22:44:26
我们可以使用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建议的那样,来自dplyr的dense_rank可能也会随着值的增加而工作
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或使用rle的base R选项
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或者使用来自dplyr的lag
cumsum(test != lag(test, default = TRUE))
#[1] 1 1 1 1 2 2 2 2 2 2 3 3 4 4 4 4数据
test <- c(2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 7, 7, 9, 9, 9, 9)发布于 2017-04-25 22:57:09
在基数R中使用rle和rep,其中vec是您的向量:
with(rle(vec), rep(seq_along(lengths), times = lengths))https://stackoverflow.com/questions/43613874
复制相似问题