0

此处已回答了此问题的更一般版本。一位用户建议我将这个更具体的问题版本作为单独的帖子提出。

我有两个逻辑向量,如下所示:

x = c(0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0) 
y = c(0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0)

我想以这样的方式计算连续值范围之间的交叉点(在本例中为 1111),即在第一个向量中每次运行 1 最多计算一个交叉点。

使用sum(rle(x & y)$values)上述答案,我可以将上述向量的交集总数计算为2,但我期望1

4

2 回答 2

2

您是否希望交叉点的最大长度为 1。如果是这样,您可以这样做

sum(with(rle(x & y), lengths == 1 & values))
#[1] 1

当我们将andx & y的数值更改为逻辑值时,其中 1 表示为和0。由于我们只对 1 的交集(即)与最多 1 个交集感兴趣,因此我们计算满足此条件的次数ie (或者我们最多需要检查)并且仅表示 1 的 ie 。xyTRUEFALSETRUElengths == 1lengths <= 1valuesTRUE

于 2020-01-06T08:55:31.157 回答
0

我们也可以写成

sum(with(rle(x & y), lengths * values) == 1)
#[1] 1
于 2020-01-06T16:30:15.713 回答