从向量x
中排除元素,
x <- c(1, 4, 3, 2)
我们可以减去位置向量:
excl <- c(2, 3)
x[-excl]
# [1] 1 2
这也可以动态工作,
(excl <- which(x[-which.max(x)] > quantile(x, .25)))
# [1] 2 3
x[-excl]
# [1] 1 2
直到 excl
长度为零:
excl.nolength <- which(x[-which.max(x)] > quantile(x, .95))
length(excl.nolength)
# [1] 0
x[-excl.nolength]
# integer(0)
我可以重新表述这一点,但我有许多应用 excl
的对象,例如:
letters[1:4][-excl.nolength]
# character(0)
我知道我可以使用setdiff
,但它相当长且难以阅读:
x[setdiff(seq(x), excl.nolength)]
# [1] 1 4 3 2
letters[1:4][setdiff(seq(letters[1:4]), excl.nolength)]
# [1] "a" "b" "c" "d"
现在,我可以利用这样一个事实:如果元素数量大于元素数量,则不会排除任何内容:
length(x)
# [1] 4
x[-5]
# [1] 1 4 3 2
概括地说,我应该使用 .Machine$integer.max
:
tmp <- which(x[-which.max(x)] > quantile(x, .95))
excl <- if (!length(tmp) == 0) tmp else .Machine$integer.max
x[-excl]
# [1] 1 4 3 2
包装到一个函数中,
e <- function(x) if (!length(x) == 0) x else .Machine$integer.max
这非常方便且清晰:
x[-e(excl)]
# [1] 1 2
x[-e(excl.nolength)]
# [1] 1 4 3 2
letters[1:4][-e(excl.nolength)]
# [1] "a" "b" "c" "d"
但我觉得有点可疑......
是否有更好的同样简洁的方法来处理基 R 中长度为零的子集?
编辑
excl
作为之前函数的动态结果出现(如上面的 which
所示),长度可能为零或不为零。如果 length(excl) == 0
则不应排除任何内容。以下代码行,例如x[-excl]
最多不必更改或尽可能少更改。
最佳答案
您可以用自己的函数覆盖[
。
"[" <- function(x,y) {if(length(y)==0) x else .Primitive("[")(x,y)}
x <- c(1, 4, 3, 2)
excl <- c(2, 3)
x[-excl]
#[1] 1 2
excl <- integer()
x[-excl]
#[1] 1 4 3 2
rm("[") #Go back to normal mode
关于r - 当子集长度为零时,如何简洁地处理子集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59406950/