Как разбить список векторов на маленькие списки в порядке убывания по r - PullRequest
0 голосов
/ 11 ноября 2018

Предположим, у меня есть функция, которая возвращает мне список из нескольких векторов. Предположим, что я хотел бы разделить этот список на небольшие списки с разным количеством векторов. Количество векторов в каждом списке отличается от одного списка к другому. Мне нужно создавать эти списки в порядке убывания.

Общий пример:

Предположим, у меня n переменных. Тогда k = n:2. Моя функция вернет мне список n(n-1)/2 векторов. Тогда количество новых подсписков будет n - 1. Следовательно, мне нужно иметь n-1 разных списков. Количество векторов в каждом списке J = 1:k-1.

Числовой пример:

Если n=4, то k=4, 3, 2, затем J=3,2,1. Следовательно, моя функция вернет мне 6 векторов. Эти векторы должны храниться в разных списках. Количество векторов в каждом списке основано на J. Следовательно, у меня будет 3 разных списка следующим образом:

  • 3 вектора в первом списке.
  • 2 вектора во втором списке.
  • один вектор в последнем списке.

Другими словами, возвращаемый список (вывод моей функции) должен быть разбит на подсписки в порядке убывания на основе J.

Моя функция очень сложная. Следовательно, я предоставлю список из 6 векторов в качестве вывода моей функции.

Предположим, моя функция вернула мне следующий список:

x <- list(x1=c(1,2,3), x2=c(1,4,3), x3=c(3,4,6), x4=c(4,8,4), x5=c(4,33,4), x6=c(9,6,7))

Как я могу разделить его на подсписки, как описано выше? Исключенный вывод:

x_sub1 <- list(x1=c(1,2,3), x2=c(1,4,3), x3=c(3,4,6))
x_sub2 <- list(x4=c(4,8,4), x5=c(4,33,4))
x_sub3 <- list(x6=c(9,6,7))

Я пробовал это:

x_sub <- list()
for(j in 1:(k-1)){
    x_sub[[j]] <- x[[i]]
    }

и, конечно, это не то, что я ожидал.

Есть идеи, пожалуйста? Как я генерирую его для произвольного числа векторов? например, как я могу применить идею разделения по n векторам?

Большое спасибо за помощь.

Ответы [ 2 ]

0 голосов
/ 11 ноября 2018
x <- list(x1=c(1,2,3), x2=c(1,4,3), x3=c(3,4,6),
          x4=c(4,8,4), x5=c(4,33,4),
          x6=c(9,6,7))

Вы можете попробовать функцию split() для разделения вашего списка x по определенному формату. Я не понимаю, что вы имеете в виду для n, k, J, поэтому вам нужно определить их самостоятельно. Я просто установил J как 1:3.

J <- 1:3
breaks <- rep(J, rev(J)) # [1] 1 1 1 2 2 3
y <- split(x, f = breaks)
names(y) <- paste0("x_sub", J)
list2env(y, envir = .GlobalEnv)

x_sub1
x_sub2
x_sub3
0 голосов
/ 11 ноября 2018

Мы можем использовать rep до split list в list из lists

lst <- split(x, rep(paste0("x_sub", 1:3), 3:1))

и извлеките вложенное list с именем

lst[["x_sub1"]]

Лучше не создавать несколько объектов в глобальной среде. Но, если это необходимо, используйте list2env

list2env(lst, envir = .GlobalEnv)
x_sub1
#$x1
#[1] 1 2 3

#$x2
#[1] 1 4 3

#$x3
#[1] 3 4 6
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...