我通过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)
答案 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
更改为any
。 The vectorization comes at more memory usage,但可能值得。
答案 1 :(得分:2)
您可以使用rle
,因为它是二进制文件,即0
和1
:
flag = function(x)any(with(rle(x),lengths[values==1]>1))
如果非二进制,但您要检查两个相邻元素是否非零,则:
flag = function(x)any(with(rle(x>0),lengths[values]>1))
这是考虑二进制和非二进制的一般情况