Получить строки, которые не содержат 0 - PullRequest
4 голосов
/ 01 ноября 2011

Я хотел бы создать новую матрицу из другой матрицы, но только со строками, которые не содержат 0, как я могу это сделать?

Ответы [ 4 ]

6 голосов
/ 01 ноября 2011

Вот более векторизованный способ.

x <- matrix(c(0,0,0,1,1,0,1,1,1,1), ncol = 2, byrow = TRUE)

x[rowSums(x==0)==0,]
1 голос
/ 01 ноября 2011

Я только собираю воедино те замечательные предложения, которые уже дали другие.Мне нравится возможность сохранять это как функцию и обобщать значения, кроме 1, включая категориальные значения (также выбирает положительно или отрицательно, используя аргумент select):

v.omit <- function(dataframe, v = 0, select = "neg") {
    switch(select, 
        neg = dataframe[apply(dataframe, 1, function(y) !any(y %in% (v))), ],  
        pos = dataframe[apply(dataframe, 1, function(y) any(y %in% (v))), ])
} 

Давайте попробуем.

x <- matrix(c(0,0,0,1,1,0,1,1,1,1,NA,1), ncol = 2, byrow = TRUE)

v.omit(x)
v.omit(mtcars, 0)
v.omit(mtcars, 1)
v.omit(CO2, "chilled") 
v.omit(mtcars, c(4,3))
v.omit(CO2, c('Quebec', 'chilled'))
v.omit(x, select="pos")
v.omit(CO2, c('Quebec', 'chilled'), select="pos")
v.omit(x, NA)
v.omit(x, c(0, NA))

Пожалуйста, не отмечайте мой ответ как правильный, так как другие ответили до меня, это просто для продолжения разговора.Спасибо за код и вопрос.

1 голос
/ 01 ноября 2011

Я обнаружил, что это можно сделать очень просто

x <- matrix(c(0,0,0,1,1,0,1,1,1,1), ncol = 2, byrow = TRUE)

y <- cbind (x[which(x[,1]*x[,2] >0), 1:2]) 
0 голосов
/ 01 ноября 2011

Я уверен, что есть лучшие способы, но вот один подход. Мы будем использовать apply() и функцию all() для создания логического вектора для индексации интересующей матрицы.

x <- matrix(c(0,0,0,1,1,0,1,1,1,1), ncol = 2, byrow = TRUE)
x
> x
     [,1] [,2]
[1,]    0    0
[2,]    0    1
[3,]    1    0
[4,]    1    1
[5,]    1    1
> x[apply(x, 1, function(y) all(y > 0)) ,]
     [,1] [,2]
[1,]    1    1
[2,]    1    1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...