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)
解决方案
对于任何二进制向量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
。矢量化带来更多的内存使用,但可能是值得的。
推荐阅读
- angular - 在 IE10 中将日历更改为法语的问题
- java - 不使用 FXML 从另一个类访问 Javafx 元素
- wordpress - 如何在古腾堡 wordpress 中创建自定义嵌入块
- sql - 有没有办法确保 WHERE 子句在 DISTINCT 之后发生?
- c++ - rdtsc乱序执行的解决方案?
- java - 数字日期格式
- angular - 当使用异步管道在 NGXS 存储中更改状态时,Angular 组件不会重新评估
- sql - 过滤视图时如何利用基础索引?
- c# - 我需要使用 xpath 在我的 HTML 中获取没有标签的文本
- javascript - 当我尝试在我的网站上构建键盘快捷键时,为什么 jQuery keyup 不起作用?