关于否定运算符减号的基本问题

Basic question about minus sign for negative operator

我不确定我是否理解减号的行为。

x <- 10:1
y <- c(4, 7)
x[y]
# [1] 7 4
x[-y]
# [1] 10  9  8  6  5  3  2  1

因此 x[-y] 中的 - 标志被理解为 x 的项目,而不是 y.

x <- 10:1
y <- 1:10
x[-y]
# integer(0)

再次合乎逻辑,如果 y 具有 x 的所有元素,则 x[-y] 应该为空。

现在如果 y 本身是空的,您会期望 x[-y] 应该列出 x 的所有元素。 然而:

x <- 10:1
y <- integer()
x[-y]
# integer(0)

我不明白什么? 是否有任何其他运算符做我想做的事情(即列出 x 中不在 y 中的元素,因此列出 x 的所有元素是 y 是空的)?

So the - sign in x[-y] is understood as items of x that are not y.

不是,这里用y作为x的索引。你可以这样想:

setNames(x, paste0('x', seq_along(x)))
#  x1  x2  x3  x4  x5  x6  x7  x8  x9 x10 
# 10   9   8   7   6   5   4   3   2   1 

x[-c(4, 7)]  ## delete x4 and x7
# [1] 10  9  8  6  5  3  2  1

如果您想要 x 中不在 y 中的元素,您需要说:

x[!x %in% y]
# [1] 10  9  8  6  5  3  2  1

y1 <- NULL
x[!x %in% y1]
# [1] 10  9  8  7  6  5  4  3  2  1

或者:

setdiff(x, y)
# [1] 10  9  8  6  5  3  2  1

setdiff(x, y1)
# [1] 10  9  8  7  6  5  4  3  2  1

因此,在这个中我们删除了 1:10 中的所有元素索引,并且由于我们在 x 中只有 10 个元素,我们得到空向量:

x[-(1:10)]
# numeric(0)

对于最后一个,我们可以在文档 help("Extract") 中读到 “空索引选择所有值:这最常用于替换所有条目但保留属性。 "

x[-integer()]
# integer(0)

如何不删除任何内容

如果我们什么都不想删除,我们需要一个比x,

中的元素数量更高的索引
x[-11]
# [1] 10  9  8  7  6  5  4  3  2  1

我们可以在哪里动态地做:

x[-.Machine$integer.max]
# [1] 10  9  8  7  6  5  4  3  2  1

@jay.sf的回答解释了如何得到你想要的。我只是想添加更多解释,并提出不同方法的建议。

当你说 x[-y] 时,减号没有任何特殊含义:它只是改变 y 元素的符号。它将给出与

相同的结果
z <- -y
x[z]

y为空时,z也为空,所以x[y]x[-y]相同。

我的建议是当你想对它们进行逻辑操作时使用逻辑索引。所以你可能一直在这样做:

y <- which(x %% 50 == 11)

选择满足条件x %% 50 == 11的条目。那么如果你 碰巧有一个没有满足条件的向量,你得到一个空 y。更好的方法是

y <- x %% 50 == 11

因此 y 是所有 FALSE 值的向量。如果你想要补码,使用

x[!y]

你会得到全部x