У меня есть два входа: один - столбец, где один столбец - столбец списка с определением пользовательской функции.Этот тиббл также содержит переменную id, указывающую конкретный набор параметров, которые генерировали данные.Для каждого идентификатора в этой таблице есть n строк, каждая из которых имеет свой вариант пользовательской функции.
Я хочу применить эту пользовательскую функцию к каждому элементу другого ввода.Это список списков (фактически экземпляров ссылочного класса, с одним наблюдением для каждого значения 'id'), из которого мне нужно извлечь поле 'z' и применить пользовательскую функцию.Следовательно, каждый 'z' повторяется n раз, и каждый раз к нему применяется другая версия пользовательской функции.
Конечная цель - иметь вложенный тиббл, который я могу использовать вggplot для создания отдельного графика для каждого значения 'id'.
Я добился этого с помощью приведенного ниже кода, но результат для больших таблиц (> 10M строк) очень медленный из-за операций unnest-nest в конце, чтобы сгруппировать столбцы 'z' и 'zfn'в список столбцов тиблов.
Вопрос в том, можно ли избежать этой последовательности гнезда и все же получить столбец списка столбцов, которые можно использовать при вызове ggplot?
library(tidyverse)
# First input, includes the list column of custom function definitions 'fndef'
dfA <- tibble(
id = rep(1:2, each = 3),
fndef = list(function(x) x + 1, function(x) x + 2, function(x) x + 3,
function(x) x + 4, function(x) x + 5, function(x) x + 6)
)
# Second input is a list of instances of a reference class from which we
# are going to extract a field 'z' later on.
# Since each instance matches 'id', the element 'z' needs to be repeated
.Model <- setRefClass(
"Model",
fields = list(id = 'numeric',
z = 'matrix')
)
dfB <- list(.Model(id = 1, z = as.matrix(rnorm(10))),
.Model(id = 2, z = as.matrix(rnorm(10))))
# Combine inputs, extract 'z' from 'dfB', apply 'fndef' to each 'z' to return 'zfn' and
# group both 'z' and 'zfn' into a tibble.
dfC <- dfA %>%
group_by(id) %>%
nest() %>%
ungroup() %>%
mutate(z = map(.x = dfB, .f = ~.x$z)) %>%
unnest(cols = data) %>%
mutate(zfn = map2(.x = .$z, .y = .$fndef, .f = ~.y(.x))) %>%
select(-fndef) %>%
unnest(cols = c(z, zfn)) %>%
group_by(id) %>%
nest()
# Ultimate goal is to plot, one plot per 'id'.
dfD <- dfC %>%
group_by(id) %>%
mutate(plot = map2(data, id, ~ggplot(data = .x, mapping = aes(x = z, y = zfn)) +
geom_line()))