首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >重新排序向量中的运行计数

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

Stack Overflow用户
提问于 2017-04-25 22:43:38
回答 2查看 92关注 0票数 1

我正在尝试找出是否有一种方法可以做到这一点而不需要for循环。

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

代码语言:javascript
复制
num[1:4651] 2 2 2 2 3 3 3 3 3 3 7 7 9 9 9 9, etc.

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

代码语言:javascript
复制
1 1 1 1 2 2 2 2 3 3 4 4 4 4, etc. 
EN

回答 2

Stack Overflow用户

发布于 2017-04-25 22:44:26

我们可以使用match来做这件事

代码语言:javascript
复制
match(test, unique(test))
#[1] 1 1 1 1 2 2 2 2 2 2 3 3 4 4 4 4

或者另一种选择是factor

代码语言:javascript
复制
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建议的那样,来自dplyrdense_rank可能也会随着值的增加而工作

代码语言:javascript
复制
dplyr::dense_rank(test)
#[1] 1 1 1 1 2 2 2 2 2 2 3 3 4 4 4 4

如果这些值不再重复,则可以使用rleid

代码语言:javascript
复制
data.table::rleid(test)
#[1] 1 1 1 1 2 2 2 2 2 2 3 3 4 4 4 4

或使用rlebase R选项

代码语言:javascript
复制
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

或者另一种选择是

代码语言:javascript
复制
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

或者使用来自dplyrlag

代码语言:javascript
复制
cumsum(test != lag(test, default = TRUE))
#[1] 1 1 1 1 2 2 2 2 2 2 3 3 4 4 4 4

数据

代码语言:javascript
复制
test <- c(2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 7, 7, 9, 9, 9, 9)
票数 4
EN

Stack Overflow用户

发布于 2017-04-25 22:57:09

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

代码语言:javascript
复制
with(rle(vec), rep(seq_along(lengths), times = lengths))
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43613874

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档