【发布时间】:2022-01-05 10:07:40
【问题描述】:
我在R 中遇到了一些奇怪的行为。假设我有一个矩阵,我想删除一组指定的行和列。这是一个完美运行的示例。
#Create a matrix
MATRIX <- matrix(1:50, nrow = 4, ncol = 5)
rownames(MATRIX) <- c('a', 'b', 'c', 'd')
colnames(MATRIX) <- c('a', 'b', 'c', 'd', 'e')
#Specify rows and columns to remove
REMOVE.ROW <- 3
REMOVE.COL <- 2
#Print the matrix without these rows or columns
MATRIX[-REMOVE.ROW, -REMOVE.COL]
a c d e
a 1 9 13 17
b 2 10 14 18
d 4 12 16 20
但是,当 REMOVE.ROW 或 REMOVE.COL 中的一个或两个对象为空时,它不会删除任何内容(因此返回原始矩阵),而是返回一个空矩阵.
#Specify rows and columns to remove
REMOVE.ROW <- integer(0)
REMOVE.COL <- integer(0)
#Print the matrix without these rows or columns
MATRIX[-REMOVE.ROW, -REMOVE.COL]
<0 x 0 matrix>
直觉上,我本以为删除一组空索引会留下原始索引集,因此我本以为从该命令返回完整矩阵。出于某种原因,R 在这种情况下从矩阵中删除了所有行和列。据我所知,这似乎是 R 中的一个错误,但也许有一些我不知道的充分理由。
问题:有人能解释一下为什么R 会这样吗?除了使用 if-then 语句来处理特殊情况之外,我是否可以进行任何简单的调整以使 R 按我的意愿行事?
【问题讨论】:
-
不幸的是,负行/列索引具有这个令人讨厌的特性/错误,正如您所展示的那样。这不是新的。我不知道是否已在某个时候编写了错误报告并且被拒绝或仍在等待中,但我会支持“修复”此功能/错误的建议。
NotEmpty <- function(z, default = TRUE) if (!length(z)) default else z然后MATRIX[-REMOVE.ROW, NotEmpty(-REMOVE.COL)]修复了症状,但几乎没有更容易/更好。所有使用负索引进行删除的代码都必须始终以这种方式进行防御。 -
-integer(0)与integer(0)相同,因此您没有选择行和列