将唯一标识符分配给 R 中连续的二项式值序列
Assigning unique identifier to consecutive sequences of binomial values in R
我有一个数据框,其列由 0 和 1 的序列组成。 0 并不重要,但 1 表示时间序列中发生的事件,目标是为每个事件分配一个唯一值。简单的整数值就足够了。所以在下面的代码中,'x' 是我所拥有的,'goal' 是我所追求的。
这看起来很简单,但我不太知道如何在帮助搜索中表达问题...
我的数据框是什么:
x <- c(rep(0,4),rep(1,5),rep(0,2),rep(1,4),rep(0,10),rep(1,3))
x <- data.frame(x)
我想要的数据框:
x$goal <- c(rep(0,4),rep(1,5),rep(0,2),rep(2,4),rep(0,10),rep(3,3))
这实际上是一个 运行 长度的编码,带有轻微的扭曲(零化 0
s)。
虽然 data.table::rleid
做得很好,但如果您还没有使用该软件包,那么我们将使用
my_rleid <- function(x) { yy <- rle(x); rep(seq_along(yy$lengths), yy$lengths); }
从这里,我们将看到
x$out <- my_rleid(x$x)
x$out <- ifelse(x$x == 0, 0L, x$out)
x
# x goal out
# 1 0 0 0
# 2 0 0 0
# 3 0 0 0
# 4 0 0 0
# 5 1 1 2
# 6 1 1 2
# 7 1 1 2
# 8 1 1 2
# 9 1 1 2
# 10 0 0 0
# 11 0 0 0
# 12 1 2 4
# 13 1 2 4
# 14 1 2 4
# 15 1 2 4
# 16 0 0 0
# 17 0 0 0
# 18 0 0 0
# 19 0 0 0
# 20 0 0 0
# 21 0 0 0
# 22 0 0 0
# 23 0 0 0
# 24 0 0 0
# 25 0 0 0
# 26 1 3 6
# 27 1 3 6
# 28 1 3 6
非常接近。如果你需要连续的数字(没有像上面那样的空隙),那么
x$out <- match(x$out, sort(unique(x$out))) - (0 %in% x$out)
x
# x goal out
# 1 0 0 0
# 2 0 0 0
# 3 0 0 0
# 4 0 0 0
# 5 1 1 1
# 6 1 1 1
# 7 1 1 1
# 8 1 1 1
# 9 1 1 1
# 10 0 0 0
# 11 0 0 0
# 12 1 2 2
# 13 1 2 2
# 14 1 2 2
# 15 1 2 2
# 16 0 0 0
# 17 0 0 0
# 18 0 0 0
# 19 0 0 0
# 20 0 0 0
# 21 0 0 0
# 22 0 0 0
# 23 0 0 0
# 24 0 0 0
# 25 0 0 0
# 26 1 3 3
# 27 1 3 3
# 28 1 3 3
我选择使用 - (0 %in% x$out)
而不是硬编码 1
的原因是我想防止数据中没有 0 的可能性。换句话说,(0 %in% x$out)
解析为 FALSE
或 TRUE
,当从 integer
中减去时,分别被强制为 0L
或 1L
.我需要这个的原因:如果 $out
中有一个 0
,那么 match
将有效地成为 match(0, 0:6)
,这将是 return 1
。我们希望 x == 0
匹配为 0L
,因此我们必须减去一个。由于第二个参数(来自 sort(unique(.))
)总是基于 0(如此处)或基于 1(x$x
中不存在零),因此很容易调整。
如果你确定这不可能,并且你不喜欢我附加到match(.)
的- (.)
,那么你可以将其更改为 match(.) - 1L
.
我有一个数据框,其列由 0 和 1 的序列组成。 0 并不重要,但 1 表示时间序列中发生的事件,目标是为每个事件分配一个唯一值。简单的整数值就足够了。所以在下面的代码中,'x' 是我所拥有的,'goal' 是我所追求的。
这看起来很简单,但我不太知道如何在帮助搜索中表达问题...
我的数据框是什么:
x <- c(rep(0,4),rep(1,5),rep(0,2),rep(1,4),rep(0,10),rep(1,3))
x <- data.frame(x)
我想要的数据框:
x$goal <- c(rep(0,4),rep(1,5),rep(0,2),rep(2,4),rep(0,10),rep(3,3))
这实际上是一个 运行 长度的编码,带有轻微的扭曲(零化 0
s)。
虽然 data.table::rleid
做得很好,但如果您还没有使用该软件包,那么我们将使用
my_rleid <- function(x) { yy <- rle(x); rep(seq_along(yy$lengths), yy$lengths); }
从这里,我们将看到
x$out <- my_rleid(x$x)
x$out <- ifelse(x$x == 0, 0L, x$out)
x
# x goal out
# 1 0 0 0
# 2 0 0 0
# 3 0 0 0
# 4 0 0 0
# 5 1 1 2
# 6 1 1 2
# 7 1 1 2
# 8 1 1 2
# 9 1 1 2
# 10 0 0 0
# 11 0 0 0
# 12 1 2 4
# 13 1 2 4
# 14 1 2 4
# 15 1 2 4
# 16 0 0 0
# 17 0 0 0
# 18 0 0 0
# 19 0 0 0
# 20 0 0 0
# 21 0 0 0
# 22 0 0 0
# 23 0 0 0
# 24 0 0 0
# 25 0 0 0
# 26 1 3 6
# 27 1 3 6
# 28 1 3 6
非常接近。如果你需要连续的数字(没有像上面那样的空隙),那么
x$out <- match(x$out, sort(unique(x$out))) - (0 %in% x$out)
x
# x goal out
# 1 0 0 0
# 2 0 0 0
# 3 0 0 0
# 4 0 0 0
# 5 1 1 1
# 6 1 1 1
# 7 1 1 1
# 8 1 1 1
# 9 1 1 1
# 10 0 0 0
# 11 0 0 0
# 12 1 2 2
# 13 1 2 2
# 14 1 2 2
# 15 1 2 2
# 16 0 0 0
# 17 0 0 0
# 18 0 0 0
# 19 0 0 0
# 20 0 0 0
# 21 0 0 0
# 22 0 0 0
# 23 0 0 0
# 24 0 0 0
# 25 0 0 0
# 26 1 3 3
# 27 1 3 3
# 28 1 3 3
我选择使用 - (0 %in% x$out)
而不是硬编码 1
的原因是我想防止数据中没有 0 的可能性。换句话说,(0 %in% x$out)
解析为 FALSE
或 TRUE
,当从 integer
中减去时,分别被强制为 0L
或 1L
.我需要这个的原因:如果 $out
中有一个 0
,那么 match
将有效地成为 match(0, 0:6)
,这将是 return 1
。我们希望 x == 0
匹配为 0L
,因此我们必须减去一个。由于第二个参数(来自 sort(unique(.))
)总是基于 0(如此处)或基于 1(x$x
中不存在零),因此很容易调整。
如果你确定这不可能,并且你不喜欢我附加到match(.)
的- (.)
,那么你可以将其更改为 match(.) - 1L
.