Как разделить вектор на субвекторы различной длины, используя R - PullRequest
2 голосов
/ 06 октября 2019

Я хочу разбить вектор на подвекторы различной длины, указав средние длины субвекторов.

Я могу найти ответ, который дает только подсказку, но не тот, который я хочу, на

ts <- 1:23 # the parent vector
bs <- 3 # lenght of subvector
nb <- length(ts) / bs # number of subvector
split(ts, rep(1:nb, each=bs, length.out = length(ts)))
#$`1`
#[1] 1 2 3

#$`2`
#[1] 4 5 6

#$`3`
#[1] 7 8 9

#$`4`
#[1] 10 11 12

#$`5`
#[1] 13 14 15

#$ `6`
#[1] 16 17 18

#$ `7`
#[1]

что я хочу

средняя длина 4 дисперсии длина 2 2 1010 *

характер того, что я хочу

#$`1`
#[1] 1 2 

#$`2`
#[1] 3 4 5 6

#$`3`
#[1] 7 8 9

#$`4`
#[1] 10 

#$`5`
#[1] 11 12 13 14 15 16

#$`6`
#[1] 17 18

#$`7`
#[1] 19 20 21 23 23

1 Ответ

1 голос
/ 06 октября 2019

Мы могли бы создать нормальный распределенный вектор плотности dens с length(ts), средним значением 4 и дисперсией 2. Из этого мы вычисляем вероятности probs, которые мы используем для рисования случайных sample() с длины ts. Из этого мы можем выбрать bins с желаемой длиной до split() ts. Чтобы убедиться, что ячейки действительно имеют желаемое среднее значение и дисперсию, мы можем упаковать все это в цикл repeat до all.equal() с конкретными значениями tol, обеспечивающими выход TRUE.

ts <- 1:23  # the parent vector
bs <- 3  # lenght of subvector
nb <- length(ts) / bs  # number of subvector


set.seed(69429)
repeat {
  dens <- dnorm(ts, mean=4, sd=sqrt(2))  # density
  probs <- dens/sum(dens)  # probabilities
  sizes <- sample(length(ts), size=nb, replace=TRUE, prob=probs)  # sample bin sizes
  bins <- as.numeric(sort(factor(
    sample(nb, length(ts), replace=TRUE),  # sample bins
    levels=1:length(ts))))
  if (all.equal(c(mean(table(bins)), var(table(bins))), c(4, 2), tol=.1) == TRUE) {
    break
  }
}
bins
# [1] 1 1 1 1 2 2 2 2 3 3 3 3 3 3 4 4 4 5 5 6 6 6 6

Расщепление

(S <- split(ts, as.numeric(bins)))
# $`1`
# [1] 1 2 3 4
# 
# $`2`
# [1] 5 6 7 8
# 
# $`3`
# [1]  9 10 11 12 13 14
# 
# $`4`
# [1] 15 16 17
# 
# $`5`
# [1] 18 19
# 
# $`6`
# [1] 20 21 22 23

Чек

c(mean=mean(lengths(S)), var=var(lengths(S)))
#     mean      var 
# 3.833333 1.766667
...