r - 当子集长度为零时,如何简洁地处理子集?

标签 r subset

从向量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/

相关文章:

r - 基于向量条件的子集数据框

r - 如何根据分位数截止值过滤矩阵中的基因?

r - R 中变量的联合出现

r - 根据列条目(或排名)对数据框进行子集化

r - 在 R 数据框中查找列值遵循序列的行

r - 在 dplyr 管道运算符中组合条件评估 (%>%)

R - 如何根据包含要用于操作的列的名称的额外列对每一行的不同列进行操作

r - 使用subset()删除列和直接在R中的公式中删除变量有什么区别?

r - 如何使用 R 获得 LOWESS 拟合的置信区间?

R xts pkg 和季度数据