[英]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.