Не могу найти правильное заклинание Reduce
, Recall
, lapply
для выполнения следующей задачи.Рассмотрим следующую функцию:
bisect.df <- function(d){
n <- ncol(d)
if(n%%2) n <- n-1 # drop one col if odd number
ind <- sample(n)[seq.int(n/2)] # split randomly both parts
list(first=d[, ind],
second=d[, -ind])
}
с учетом data.frame
, она возвращает список двух дочерних элементов data.frames
с равным ncol
, извлеченных случайным образом из их родителя.Я хочу применить эту функцию рекурсивно к потомкам до определенного уровня, скажем, 3 поколения.Я могу сделать это тривиально по одному поколению за раз,
bisect.list <- function(l){
unlist(lapply(l, bisect.df), recursive=FALSE)
}
, но как я могу назвать это рекурсивно, скажем, N=3
раз?
Вот тестовый образец для игры с
d <- data.frame(matrix(rnorm(16*5), ncol=16))
step1 <- bisect.list(list(d))
step2 <- bisect.list(step1)
step3 <- bisect.list(step2)
str(list(step1, step2, step3))