如果超过 R 中的长度,则对向量进行子集化并检索第一个元素

Subset a vector and retrieve first elements if exceed the length in R

假设我有一个这样的向量:

c("A", "B", "C", "D")

有 4 个位置。如果我制作一个大小为 1 的样本,我可以获得 1、2、3 或 4。我想要的是能够根据该向量的顺序对该向量的长度 3 进行子集化,例如,如果我得到 2:

c("B", "C", "D")

如果我得到 3:

c("C", "D", "A")

如果我得到 4:

c("D","A", "B")

这就是逻辑,向量被排序,当我子集化时,最后的元素与第一个元素连接。

我想我明白了!

v <- c("A", "B", "C", "D")
p <- sample(1:length(v), 1)
r <- c(v[p:length(v)])
c(r, v[!(v %in% r)])[1:3]

输出:

v <- c("A", "B", "C", "D") # your vector

r <- c(v[2:length(v)])
c(r, v[!(v %in% r)])[1:3]
#> [1] "B" "C" "D"

r <- c(v[3:length(v)])
c(r, v[!(v %in% r)])[1:3]
#> [1] "C" "D" "A"

r <- c(v[4:length(v)])
c(r, v[!(v %in% r)])[1:3]
#> [1] "D" "A" "B"

reprex package (v2.0.1)

于 2022-05-16 创建

包装在函数中:

f <- function(v, nth) {
  r <- c(v[nth:length(v)])
  return(c(r, v[!(v %in% r)])[1:3])
}

使用 seqf 为您提供指定向量 v 所需的子集,您希望将其中 l 个元素的起点设为子集第 n 个位置。

f <- function(v, n, l) v[seq(n - 1, length.out = l) %% length(v) + 1]

输出

f(v, n = 4, l = 3)
#[1] "D" "A" "B"

f(v, n = 3, l = 4)
#[1] "C" "D" "A" "B"

f(v, n = 2, l = 5)
#[1] "B" "C" "D" "A" "B"