簡體   English   中英

如何在 R 中查找具有特定數量的連續 0 和 1 的矩陣中的行

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM