为连续值创建组名

zx8*_*754 8 r run-length-encoding

看起来像一个简单的任务,无法弄清楚一个更简单的方法.我在x下面有一个向量,需要为连续值创建组名.我的尝试是使用rle更好的想法?

# data
x <- c(1,1,1,2,2,2,3,2,2,1,1)

# make groups
rep(paste0("Group_", 1:length(rle(x)$lengths)), rle(x)$lengths)
# [1] "Group_1" "Group_1" "Group_1" "Group_2" "Group_2" "Group_2" "Group_3" "Group_4"
# [9] "Group_4" "Group_5" "Group_5"
Run Code Online (Sandbox Code Playgroud)

Sot*_*tos 11

使用rleid来自data.table,

library(data.table)

paste0('Group_', rleid(x))
 #[1] "Group_1" "Group_1" "Group_1" "Group_2" "Group_2" "Group_2" "Group_3" "Group_4" "Group_4" "Group_5" "Group_5"
Run Code Online (Sandbox Code Playgroud)


Rol*_*and 9

使用diffcumsum:

paste0("Group_", cumsum(c(1, diff(x) != 0)))
#[1] "Group_1" "Group_1" "Group_1" "Group_2" "Group_2" "Group_2" "Group_3" "Group_4" "Group_4" "Group_5" "Group_5"
Run Code Online (Sandbox Code Playgroud)

(如果您的值是浮点值,则可能必须避免!=使用容差.)

  • 很好 - 我猜这比`rle(x)`更快并且处理输出.OTOH,我想知道如何将组名映射到运行,在这种情况下也可以使用`rle(x)$ lengths`. (3认同)
  • `abs(diff(x)) &lt; tol` 和基于 `help(".Machine")` 的 `tol`。 (2认同)