按顺序和值执行分组

时间:2014-08-01 02:23:44

标签: r

我需要将组分配给连续发生的事件。 我将通过例子解释:

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"]))

有更美妙的方式吗?

1 个答案:

答案 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)))