![](/img/trans.png)
[英]How can I analyze the consecutive persistence of signals (1s and 0s) in dataset in R?
[英]How to find rows in matrix with specific number of consecutive 0s and 1s in R
我有这个矩阵:
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
[1,] 1 0 0 0 0 0 0 0
[2,] 0 1 1 0 0 0 0 0
[3,] 0 0 1 1 0 0 0 0
[4,] 0 0 0 1 1 0 0 0
[5,] 0 0 0 0 1 1 0 0
[6,] 0 0 0 0 0 1 1 0
[7,] 0 0 0 0 0 0 1 1
我想要做的是按行过滤此矩阵,其中连续 0 和 1 的最小数量为 n。
例如,如果n = 2
,预期的 output 应该是这样的:
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
[1,] 0 0 1 1 0 0 0 0
[2,] 0 0 0 1 1 0 0 0
[3,] 0 0 0 0 1 1 0 0
[4,] 0 0 0 0 0 0 1 1
如您所见,初始矩阵的第 1、2 和 6 行分别最少只有一个连续的 1、一个连续的 0 和一个连续的 0。
如果n = 3
,则预期的 output 应该是一个空矩阵,因为没有行同时具有最少三个连续的 0 和三个连续的 1。
有没有办法创建一个 function 作为输入矩阵和值 n 并在 R 中给出预期的 output?
这是示例的矩阵:
matrix(c(1, 0, 0, 0, 0, 0, 0, 0,
0, 1, 1, 0, 0, 0, 0, 0,
0, 0, 1, 1, 0, 0, 0, 0,
0, 0, 0, 1, 1, 0, 0, 0,
0, 0, 0, 0, 1, 1, 0, 0,
0, 0, 0, 0, 0, 1, 1, 0,
0, 0, 0, 0, 0, 0, 1, 1), byrow = T, ncol = 8)
我们可以使用rle
row-wise 和 select 数字之间的最小连续长度至少为n
的行。
n <- 2
mat[apply(mat, 1, function(x) all(rle(x)$lengths >= n)), ]
# [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
#[1,] 0 0 1 1 0 0 0 0
#[2,] 0 0 0 1 1 0 0 0
#[3,] 0 0 0 0 1 1 0 0
#[4,] 0 0 0 0 0 0 1 1
数据
mat <- structure(c(1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L,
0L, 0L, 1L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 1L, 0L, 0L, 0L, 0L,
0L, 0L, 1L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 1L, 0L, 0L, 0L, 0L,
0L, 0L, 1L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 1L), .Dim = 7:8)
我们可以使用rleid
中的data.table
来创建子集行的条件
library(data.table)
n <- 2
mat[apply(mat, 1, function(x) all(table(rleid(x))>=2)),]
# [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
#[1,] 0 0 1 1 0 0 0 0
#[2,] 0 0 0 1 1 0 0 0
#[3,] 0 0 0 0 1 1 0 0
#[4,] 0 0 0 0 0 0 1 1
mat <- structure(c(1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L,
0L, 0L, 1L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 1L, 0L, 0L, 0L, 0L,
0L, 0L, 1L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 1L, 0L, 0L, 0L, 0L,
0L, 0L, 1L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 1L), .Dim = 7:8)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.