创建具有任意长度序列的向量

create a vector with sequences of arbitrary length

提问人:mr.T 提问时间:9/30/2023 最后编辑:mr.T 更新时间:9/30/2023 访问量:69

问:

我想创建一个长度的向量,它将包含任意长度的序列n

我制作了一个代码来做到这一点,但它对我来说似乎不可靠且有点荒谬。

n <- 300
vals <- c(-1,0,1)
seq_range <- 3:20

make_seq <- function() sample(vals,size=1) |> rep(sample(seq_range,1))
my_seq <- lapply(1:50,\(x) make_seq())  |> unlist() |> tail(n = n)

...

my_seq
  [1]  1  1  1  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0
 [35]  0  0  0  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1
 [69]  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  0  0  0  0  0  0  0  0  0 -1 -1 -1 -1 -1 -1 -1
[103] -1 -1 -1 -1 -1 -1  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0
[137]  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  1  1  1  1  0  0  0  0  0  0
[171]  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  1  1  1  1  1  1  1  1  1  1  1  1  1 -1
[205] -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  0  0  0  0
[239]  0  0  0  0  0  0  0  0  0  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1
[273]  1 -1 -1 -1 -1 -1 -1 -1 -1  1  1  1  1  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0

我创建了一个列表,然后将其剪切成大小,我不喜欢它...... 有没有办法或现成的函数可以替换我的代码并使其变得更好?n

==============================================================

  1. 向量内部的序列具有任意长度my_seq

  2. vector 具有长度my_seqn

  3. 例如,我想设置向量中序列的长度范围,例如在我的代码中 任何序列的长度都是从 到 是什么意思rep(sample(3:20,1))320

  4. 我想指示序列的元素,它可以是 -1,0,1 或其他具有不同元素集和数量的东西,例如 0,1 或 1,5,10,20。 但这些将永远是价值观int

R 向量 序列

评论

0赞 PGSA 9/30/2023
我认为您可能需要更具体 - 您的意思是制作任意长度的序列?您希望能够指定序列的长度,还是希望它是随机的?您是否需要能够指定序列项还是始终如此?-1, 0, 1
0赞 mr.T 9/30/2023
对不起,我更新了我的问题
2赞 margusl 9/30/2023
仅使用向量(即)喘息可能更容易一些,但是什么让您认为您的 aproach 不可靠?vlen <- ceiling(n/min(seq_range)); rep(x = sample(vals, vlen, replace = TRUE), times = sample(seq_range, vlen, replace = TRUE))[1:n]
0赞 mr.T 9/30/2023
我喜欢你的回答。我的方法不可靠,因为......lapply(1:50...) 这个 1:50 的尺寸仅适用于 n <- 300,但不适合 n <- 5000
2赞 Ritchie Sacramento 9/30/2023
@margusl - 您可以获得超过最大值 seq_range 的运行时间,因为可以连续采样相同的值。

答:

1赞 Michael M 9/30/2023 #1

你打算做什么?

n <- 300
vals <- c(-1, 0, 1)
seq_range <- 3:20

seqs <- sample(seq_range, n %/% min(seq_range), replace = TRUE)
M <- min(which(cumsum(seqs) >= n))
v <- sample(vals, M, replace = TRUE)
rep(v, seqs[1:M])[1:n]

评论

2赞 Michael M 9/30/2023
与@Ritchie提到的问题相同