首页 > 解决方案 > 如何检查向量中的任何两个相邻元素是否非零

问题描述

我有一个 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)

标签: rvector

解决方案


对于任何二进制向量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))

Usingsum给你一个副产品:它告诉你匹配的数量。


天哪,你想申请flag每一行而不是每一列DF。所以我不应该使用sapply. 在这种情况下,让我们做一个完整的矢量化:

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

在这种情况下colSums不能更改为any矢量化带来更多的内存使用,但可能是值得的。


推荐阅读