如何检查向量中的任何两个相邻元素是否非零

时间:2018-08-07 21:59:56

标签: r vector

我通过R列出了R中所有可能的12位二进制矢量的列表

all_possible_permutations <- expand.grid(replicate(12, 0:1, simplify = FALSE))

我想标记两个非零像元彼此相邻的所有向量。

例如

1 0 1 0 1 0 1 0 1 0 1 0 <- Not Flagged
1 1 0 1 0 1 0 1 0 1 0 1 <- Flagged (due to the first 2)

2 个答案:

答案 0 :(得分:2)

对于任何二进制向量x,我们可以使用以下逻辑来检测两个相邻1的现有模式:

flag <- function (x) sum(x == 1 & c(diff(x) == 0, FALSE)) > 0

x <- c(1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1)
flag(x)
#[1] TRUE

x <- c(1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0)
flag(x)
#[1] FALSE

因此我们可以将其应用于数据框DF的所有列:

sapply(DF, flag)

正如r2evans所评论的,这也有效:

flag <- function (x) any(x == 1 & c(diff(x) == 0, FALSE))

使用sum给您带来了一个副产品:它告诉您比赛的次数。


天哪,您想为每一行而不是flag的每一列应用DF。因此,我不应该使用sapply。在这种情况下,让我们进行完整的矢量化:

MAT <- t(DF)
result <- colSums(MAT == 1 & rbind(diff(MAT) == 0, FALSE)) > 0
table(result)
#FALSE  TRUE 
#  377  3719 

在这种情况下,无法将colSums更改为anyThe vectorization comes at more memory usage,但可能值得。

答案 1 :(得分:2)

您可以使用rle,因为它是二进制文件,即01

flag = function(x)any(with(rle(x),lengths[values==1]>1))

如果非二进制,但您要检查两个相邻元素是否非零,则:

flag = function(x)any(with(rle(x>0),lengths[values]>1))

这是考虑二进制和非二进制的一般情况