我需要将组分配给连续发生的事件。 我将通过例子解释:
events <- c('b', 'd', 'd', 'd', 'd', 'd', 'd', 'd', 'd', 'b', 'b', 'b', 'e', 'e', 'e', 'e', 'd', 'd', 'd')
我想要产生这个结果(连续的小组字母):
group <- c(1, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5)
对我来说,显而易见的解决方案是:
1 + cumsum(apply(cbind(c = events, n = c(NA_character_, rev(rev(events)[-1]))), 1, function(x) !is.na(x["n"]) && x["c"] != x["n"]))
有更美妙的方式吗?
答案 0 :(得分:2)
使用因素。如果你真的不关心关卡的顺序,那就去做:
factor(events)
对于大多数情况来说这应该足够了,虽然我不确切地知道你打算下一步做什么。
如果您关心订单,请执行
factor(events, levels = unique(events))
如果要删除级别并仅保留整数表示:
as.integer(factor(events, levels = unique(events)))
# [1] 1 2 2 2 2 2 2 2 2 3 4 4 5 6 7 8 9 10 11 12 13 14 15 16 16 17 18
# [28] 18 19 20 21 22 22
另一个简短的解决方案:
match(events, unique(events))
编辑:假设级别可以出现在多个连续的子集中,如果您想用新值(例如您的编辑)区分这些级别,您可以这样做:
cumsum(c(TRUE, head(events, -1) != tail(events, -1)))
或
inverse.rle(within.list(rle(events), values <- seq_along(values)))