Примените пользовательскую функцию в столбце списка ко всем элементам другого столбца списка и сгруппируйте результат в столбец списка таблиц для построения графиков. - PullRequest
1 голос
/ 26 сентября 2019

У меня есть два входа: один - столбец, где один столбец - столбец списка с определением пользовательской функции.Этот тиббл также содержит переменную 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()))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...