【问题标题】:How to remove nothing from a matrix?如何从矩阵中删除任何内容?
【发布时间】:2019-03-16 09:22:40
【问题描述】:

来自矩阵M

> (M <- matrix(1:9, 3, 3))
     [,1] [,2] [,3]
[1,]    1    4    7
[2,]    2    5    8
[3,]    3    6    9

我想按条件删除/保留列并将结果放入列表中。只要条件由没有c(NA, 0)的整数组成,就没有问题,例如

cv1 <- 1:3
lapply(cv1, function(x) M[, -x])

对于没有要删除的列的情况,我尝试将NA0 添加到条件向量中,但它不起作用。

cv2 <- c(NA, 1:3)
cv3 <- 0:3

> lapply(cv2, function(x) M[, -x])[[1]]
[1] NA NA NA

> lapply(cv3, function(x) M[, -x])[[1]]

[1,]
[2,]
[3,]

我知道我能做到

lapply(cv2, function(x) {
  if (is.na(x))
    M
  else
    M[, -x]
})

但我想知道是否有更简单的方法。

其实问题:

首先让我印象深刻的是矩阵在以下情况下消失而不是保持完整,尽管我实际上并没有尝试删除任何内容:

M[, -(na.omit(NA))]
M[, na.omit(-(NA))]
M[, -0]
M[, -logical(0)]

# [1,]
# [2,]
# [3,]

> M[, -NULL]
Error in -NULL : invalid argument to unary operator

有人可以解释这种行为的原因和优势,和/或如何正确表达吗?

【问题讨论】:

  • 也许你可以使用 setdiff(1:3, x)
  • 您可以在将这些空值传递给 lapply 之前删除它们。
  • @Cettt 不错的方法,效果很好,谢谢。
  • @RonakShah 重点是尝试删除一个空集。

标签: r matrix


【解决方案1】:

原因很简单:-x 中的减号不被视为特殊的东西,它只是一个常规的数学运算。所以-00相同,-NANA相同。

@Cettt 给出了一个答案:setdiff(seq_len(ncol(M)), x) 将给出除x 之外的列号。你可以使用逻辑索引来做同样的事情,因为如果x 是一个数字,seq_len(ncol(M)) != x 会起作用,但如果xNA 则不会。如果你真的也需要处理这种情况,你可以使用is.na(x) | seq_len(ncol(M)) != x,但@Cettt 的解决方案看起来更简单。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-26
    • 1970-01-01
    • 1970-01-01
    • 2014-10-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多