关于否定运算符减号的基本问题
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
。
我不确定我是否理解减号的行为。
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
。