R 如何将间隔随机划分为长度相等的非重叠间隔容器
我有一个间隔,例如从1到671。我想把它分成5个长度为50但间隔最小为51的随机非重叠箱子R 如何将间隔随机划分为长度相等的非重叠间隔容器,r,random,bins,R,Random,Bins,我有一个间隔,例如从1到671。我想把它分成5个长度为50但间隔最小为51的随机非重叠箱子 interval <- 1:671 (example, it does not need to be 671) interval我不知道这是否具有所需的随机性: interval <- 1:671 set.seed(42) repeat { #rejection sampling int <- list(interval) s <- integer(5) * NA
interval <- 1:671 (example, it does not need to be 671)
interval我不知道这是否具有所需的随机性:
interval <- 1:671
set.seed(42)
repeat { #rejection sampling
int <- list(interval)
s <- integer(5) * NA
for (i in 1:5) {
#sample an interval from the list
sel <- sample(length(int), 1)
isel <- int[[sel]]
#sample start value
s[[i]] <- sample(head(isel,-49), 1)
#remove sampled values from interval
sp <-
split(isel, findInterval(isel, c(0, s[[i]], s[[i]] + 50, Inf)))
if (s[[i]] > isel[1] &&
s[[i]] < length(isel) - 49)
sp <- sp[-2]
else
if (s[[i]] == isel[1])
sp <- sp[-1]
else
if (s[[i]] == length(isel) - 49)
sp <- head(sp,-1)
sp <- sp[lengths(sp) >= 50]
int <- c(sp, int[-sel])
#break out of for loop
#if not enough intervals of sufficient length left
if (length(int) < 1) break
}
if (!anyNA(s)) break
}
s
#[1] 321 74 245 170 441
library(ggplot2)
ggplot(data.frame(s = s, e = s + 49), aes(x = s, xend = e, y = 0, yend = 0)) +
geom_segment(size = 3) +
theme_minimal() +
theme(axis.text.y = element_blank(),
axis.ticks.y = element_blank(),
panel.grid.major.y = element_blank()) +
xlab("") + ylab("")
interval如果我正确理解了您的问题,您需要5个部分的时间间隔,长度为50,最小距离为51
所以你的随机性是指每个距离比51大多少
这意味着您要计算实际要分配的空间
intervalLength <- 671
nBins <- 5
binWidth <- 50
binMinDistance <- 51
spaceToDistribute <- intervalLength - (nBins * binWidth + (nBins - 1) * binMinDistance)
intervalLength类似的方法可能会奏效:
set.seed(111)
n_bins <- 5
bl <- 50
spacing <- 51
start <- 1
end <- 671
end_int <- end - n_bins*bl - (n_bins-1)*spacing
first_bin_start <- sample(start:end_int, 1)
first_bin_end <- first_bin_start + bl
avail_spacing <- end - first_bin_end - (n_bins-1)*bl - (n_bins-1)*spacing
sp <- c()
for (i in 1:(n_bins-1)){
end <- sample(1:avail_spacing, 1)
sp <- c(sp, end)
avail_spacing <- avail_spacing - end
}
bin_start <- c(first_bin_start, first_bin_start + cumsum(spacing + bl + sp))
bin_end <- bin_start + bl
df <- data.frame(bin = 1:n_bins,
bin_start = bin_start,
bin_end = bin_end)
df
set.seed(111)
n\u您说的垃圾箱长度为50,但间距至少为51,是哪一个?为什么第一个箱子不从1开始?我的意思是每个箱子的长度为50(例如1,2,3,4…50),但是下一个箱子不应该早于101开始,但不一定是在101开始,而是随机的。是的,第一个垃圾箱可以从1开始,但也不一定要在1。这并不容易。它必须是完全随机的吗?是的,这是我寻找的那种随机性。很好,谢谢,很好,非常感谢。只有这行有微小的错误,应该有startoffin而不是startoffins:result
distances <- diff(floor(c(0, sort(runif(nBins))) * spaceToDistribute))
startOfBin <- cumsum(distances) + (0:(nBins-1)) * 101
result <- data.frame(bin = 1:nBins, startOfBin = startOfBin, endOfBin = startOfBin + 49)
set.seed(111)
n_bins <- 5
bl <- 50
spacing <- 51
start <- 1
end <- 671
end_int <- end - n_bins*bl - (n_bins-1)*spacing
first_bin_start <- sample(start:end_int, 1)
first_bin_end <- first_bin_start + bl
avail_spacing <- end - first_bin_end - (n_bins-1)*bl - (n_bins-1)*spacing
sp <- c()
for (i in 1:(n_bins-1)){
end <- sample(1:avail_spacing, 1)
sp <- c(sp, end)
avail_spacing <- avail_spacing - end
}
bin_start <- c(first_bin_start, first_bin_start + cumsum(spacing + bl + sp))
bin_end <- bin_start + bl
df <- data.frame(bin = 1:n_bins,
bin_start = bin_start,
bin_end = bin_end)
df