Удалить строки, значения которых в одном столбце не попадают в диапазон `[0,1]` - PullRequest
0 голосов
/ 01 мая 2019

Я работаю с большим количеством данных, хранящихся в матрице, и я хотел бы удалить все строки, значения которых в одном столбце не попадают в диапазон [0,1]. Если матрица M (просто пример матрицы 3 на 3), я попытался с этим кодом

m<-matrix(c(1,0,2,0.7,0.8,0.5,-0.6,0.11,0.4),3,3)
      [,1] [,2]  [,3]
[1,]    1  0.7 -0.60
[2,]    0  0.8  0.11
[3,]    2  0.5  0.40

Для этого примера я должен удалить первую и третью строки. Единственное решение, которое приходит на ум, основано на циклах и

for(i in 1:n){
  array[i]<-sum(m[i,]<0, na.rm=TRUE)+sum(m[i,]>1, na.rm=TRUE)
}
for(i in 1:nrow(m)){
  if (array[i]!=0){
    m<-m[-i,]
    array<-array[-i]
  }
}

Есть ли более эффективное решение? Спасибо!

Ответы [ 2 ]

1 голос
/ 01 мая 2019

Также возможна:

m[apply(m, 2, function(x) all(x >= 0) & all(x <= 1)), ]

[1] 0.00 0.80 0.11
1 голос
/ 01 мая 2019

Мы могли бы сравнивать значения матрицы напрямую и создавать логическую матрицу и выбирать строки соответственно, используя rowSums

m[rowSums(m <= 1 & m >= 0) == ncol(m), ]
#[1] 0.00 0.80 0.11

Или другой способ сделать то же самое

m[rowSums(m > 1 | m < 0) == 0, ]

Для обеих вышеупомянутых версий мы также можем использовать apply построчно с margin = 1 для подмножества данных

m[apply(m <= 1 & m >= 0, 1, all), ]
m[!apply(m > 1 | m < 0, 1, any), ]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...