Как в R удалить все столбцы матрицы, содержащие отрицательное число?

Я хочу удалить из матрицы M те столбцы, которые содержат хотя бы одно отрицательное число. Например, если

M = (1  0  0  1)
    (1 -1  0  2)
    (2  3  4 -3)

Я хочу, чтобы М стал

M = (1  0)
    (1  0)
    (2  4)

Как вводить M <- removeNegativeColumns(M) код?


person mercury0114    schedule 04.03.2018    source источник


Ответы (3)


Простым способом может быть использование суммы для столбца для условия, где value < 0 (-ve).

    # Data
    M <- matrix(c(1,0,0,1,1, -1,  0,  2,2,  3,  4, -3), ncol = 4, byrow = T)

    M[, !colSums(M < 0 )]
#     [,1] [,2]
#[1,]    1    0
#[2,]    1    0
#[3,]    2    4
person MKR    schedule 04.03.2018
comment
Я не могу победить это по скорости. - person thelatemail; 05.03.2018
comment
чтобы выиграть несколько символов: M[,!colSums(M < 0 )] - person Moody_Mudskipper; 05.03.2018
comment
@Moody_Mudskipper Обновленный ответ с учетом вашего предложения. Спасибо еще раз. - person MKR; 05.03.2018

Проверьте, меньше ли минимум каждой строки нуля, а затем используйте это для фильтрации вашей матрицы:

filter <- apply(M, 2, function (x) min(x) < 0)
M <- M[,!filter]

Редактировать: Согласно Moody_Mudskipper, это аналогичный, но превосходный (и правильный) метод:

filter <- apply(data, 2, function (x) any(x < 0))
data <- data[,!filter]
person AidanGawronski    schedule 04.03.2018
comment
any будет немного быстрее, чем min, и вы можете заменить filter ==T просто на filter, но здесь вам нужно отфильтровать столбцы и удалить их, чтобы было M[,!filter] - person Moody_Mudskipper; 05.03.2018
comment
Мне нравится это решение, но argument x is of class numeric, should be a matrix как это исправить? - person mercury0114; 05.03.2018
comment
проблема, которую я пытаюсь решить, немного отличается: function(x) colIQRs(x, na.rm = TRUE) < 1.6 - это фактический предикат, который я ищу - person mercury0114; 05.03.2018
comment
Извините за это, я думал, что если я опубликую более простой вопрос, из данных ответов я пойму решение своей проблемы, но, похоже, это не так :-) - person mercury0114; 05.03.2018

person    schedule
comment
any(i <0)==FALSE совпадает с !any(i<0) или all(i>=0) - person Moody_Mudskipper; 05.03.2018