Как найти строки в матрице с указанным c количеством последовательных 0 и 1 в R - PullRequest
0 голосов
/ 18 апреля 2020

У меня есть эта матрица:

      [,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, ожидаемый результат должен быть следующим:

      [,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, ожидаемый вывод должен быть пустой матрицей, поскольку ни одна строка не имеет минимум трех последовательных 0 и трех последовательных 1 одновременно.

Есть ли способ создать функцию, которая принимает в качестве входных данных матрицу и значение n и дает ожидаемый результат в R?

Это матрица примера:

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)

Ответы [ 2 ]

2 голосов
/ 18 апреля 2020

Мы можем использовать rle по строкам и выбирать строки, где минимальная последовательная длина между числами составляет не менее 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)
1 голос
/ 18 апреля 2020

Мы можем использовать 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

data

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...