Create group names for consecutive values
Looks like an easy task, can't figure out a simpler way. I have an x
vector below, and need to create group names for consecutive values. My attempt was using rle
, better ideas?
# 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"
Solution 1:
Using rleid
from data.table
,
library(data.table)
rleid(x, prefix = "Group_")
#[1] "Group_1" "Group_1" "Group_1" "Group_2" "Group_2" "Group_2" "Group_3" "Group_4" "Group_4" "Group_5" "Group_5"
Solution 2:
Using diff
and cumsum
:
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"
(If your values are floating point values, you might have to avoid !=
and use a tolerance instead.)
Solution 3:
Using cumsum but not relying on the data being numeric:
paste0("Group_", 1 + c(0, cumsum(x[-length(x)] != x[-1])))
[1] "Group_1" "Group_1" "Group_1" "Group_2" "Group_2" "Group_2" "Group_3" "Group_4" "Group_4" "Group_5" "Group_5"