在R中如何删除包含负数的矩阵的所有列?

问题描述 投票:1回答:4

我想从包含至少一个负数的矩阵M中删除这些列。例如,如果

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

我希望M成为

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

如何输入M <- removeNegativeColumns(M)代码?

r matrix dimensions identity-column
4个回答
6
投票

简单的方法可能是使用sum为列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

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

M1<- apply(M, 2,function(i)
{
  p<- any(i <0)==FALSE #(any(as.vector(i)) < 0)
  p
})

M<- M[,M1]

1
投票
removeNegativeColumns <- function(M) M[,apply(M>=0,2,all)]
removeNegativeColumns(M)
#      [,1] [,2]
# [1,]    1    0
# [2,]    1    0
# [3,]    2    4

0
投票

检查每行的最小值是否小于零,然后使用它来过滤矩阵:

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]
© www.soinside.com 2019 - 2024. All rights reserved.