我想在向量中生成缺失值,以便将缺失值按顺序分组,以模拟不同长度的缺失数据周期。
假设我有一个包含 10 000 个值的向量,我想在向量中的随机位置生成 12 个 NA 序列,每个序列具有随机长度 L
介于 1 和 144 之间(144 在时间步长 10 分钟模拟 2 天的缺失值)。序列必须 不重叠 .
我怎样才能做到这一点?谢谢。
我试过结合 lapply
和 seq
没有成功。
具有 3 个不同序列的预期输出示例:
# 1 2 3 5 2 NA NA 5 4 6 8 9 10 11 NA NA NA NA NA NA 5 2 NA NA NA...
编辑
我正在处理季节性时间序列,因此 NA 必须覆盖值和 不能插入作为新元素。
最佳答案
如果每个 NA 序列的起始位置和运行长度都应该是随机的,我认为您不能确定立即找到合适的解决方案,因为您的约束是序列不能重叠。
因此,我提出了以下解决方案,该解决方案尝试了有限的次数 ( max_iter
) 以找到起始位置和 NA 游程长度的合适组合。如果找到,则返回,如果在定义的最大迭代次数内没有找到,您只会收到一条通知。
x = 1:1000
n = 3
m = 1:144
f <- function(x, n, m, max_iter = 100) {
i = 0
repeat {
i = i+1
idx <- sort(sample(seq_along(x), n)) # starting positions
dist <- diff(c(idx, length(x))) # check distance inbetween
na_len <- sample(m, n, replace = TRUE) - 1L # lengths of NA-runs
ok <- all(na_len < dist) # check overlap
if(ok | i == max_iter) break
}
if(ok) {
replace(x, unlist(Map(":", idx, idx+na_len)), NA)
} else {
cat("no solution found in", max_iter, "iterations")
}
}
f(x, n, m, max_iter = 20)
当然你可以很容易地增加迭代次数,你应该注意更大的
n
找到解决方案变得越来越困难(需要更多的迭代)。
关于r - 在向量中生成随机长度的 NA 随机序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44590380/