Мне нужна помощь в разбиении вектора на отдельные векторы любой возможной длины - PullRequest
0 голосов
/ 03 мая 2020

У меня есть большой фрейм данных, который содержит кучу различных переменных среды. Я уже разбил их на отдельные векторы и отсортировал их в порядке убывания. Мне нужна помощь, чтобы понять, как взять каждый вектор (длина 171) со значениями NA и разбить его на все возможные векторы длины больше 1.

То, что я ищу, выглядит примерно так:

vect_1 <- rnorm(10, mean = 12, sd = 2)
vect_1 <- sort(vect_1)

Group_by_2 <- split(vect_1, ceiling(seq_along(vect_1)/2))
Group_by_3 <- split(vect_1, ceiling(seq_along(vect_1)/3))
Group_by_4 <- split(vect_1, ceiling(seq_along(vect_1)/4))
…
Group_by_10 <- split(vect_1, ceiling(seq_along(vect_1)/10))

однако я хочу / нужно сделать это рекурсивно:

Я попробовал варианты следующего как начало, зная, что это не удовлетворяет мою потребность в сохранении каждого результата в отдельном списке:

N <- 1:length(vect_1)


for(val in 1:N){
  split(vect_1, ceiling(seq_along(vect_1)/N))
    print(vect_1)
}

приведенное выше дает мне только 1 список, который разбивает вектор на один список длиной N

x <- 1:10
for(i in x){
  split(vect_1, ceiling(seq_along(vect_1)/x[i]))
    print(vect_1)
}

, что дает мне 10 списков, все из которых идентичны и имеют длину 10.

Итак, в общем, что мне нужно, используя вектор 1-10

[1] - 1,2,3,4,5
[2] - 1,2,3,4 [2] - 5
[3] - 1,2,3 [3] - 4,5
[4] - 1,2 [4] - 3,4 [4] - 5
[5] - 1 [5] - 2 [5] - 3 [5] - 4 [5] - 5

Заранее благодарю за помощь.

1 Ответ

1 голос
/ 03 мая 2020

Если вы используете мой пакет multicool, то вы можете сгенерировать все целочисленные разделы целого числа n .

vect_1 = rnorm(10, mean = 12, sd = 2)
vect_1 = sort(vect_1)
n = length(vect_1)

library(multicool)
Comps = genComp(n)

Если вы посмотрите на них, вы увидите, что у некоторых есть разбиения на векторы длины 1, которые вам не нужны, поэтому мы можем выбросить их

Comps = Comps[unlist(lapply(Comps, function(part)all(part > 1)))]

Теперь вы можете использовать их для разделения.

lapply(Comps, function(part)split(vect_1, rep(1:length(part), part)))

Я не включил вывод, потому что его много, даже для такого короткого вектора. Я также подозреваю, что это не совсем то, что вы хотите, но это мое лучшее предположение.

...