Сохранение результатов функции в датафрейме, которая возвращает количество, и ggplot

Вопрос или проблема

Я написал функцию, которая возвращает мне список, содержащий число (odchylka.sr) и объект ggplot (ggpl)

model.ARIMA.RF.fct <- function (l.obs.pomin) { 

  ...
  wynik.lst <- list (odchylka.sr, ggpl)
  return(wynik.lst)

}

Я сохраняю результаты в датафрейме согласно

ARIMA.RF.cwu.wyniki <- data.frame(
  l.obs.pomin = c(52, 69, 136, 217)
  ) %>% 
  mutate(
    out = pmap(list (l.obs.pomin), model.ARIMA.RF.fct)
  )

Я получаю

вставьте описание изображения здесь

Я хочу, чтобы odchylka.sr была отдельным столбцом перед столбцом ‘out’.

Я не могу справиться с этой задачей.

Я использую pmap, потому что моя целевая функция имеет 3 аргумента


function_that_returns_lists <- function(x){
  
  list(thing_1 = x+1,
       thing_2 = x^2)
}

df1 <- data.frame(
  l.obs.pomin = c(52, 69, 136, 217)
) %>% 
  mutate(
    out = pmap_df(list (l.obs.pomin), function_that_returns_lists) # pmap_df, чтобы out был более удобно структурирован
  ) |> unnest(out) # легко отделить по его столбцам в набор данных

Ответ или решение

Для решения вашей задачи, вы можете использовать функцию pmap_df вместе с функцией unnest из пакета tidyr, что позволит вам выделить каждый элемент списка, возвращаемого вашей функцией, в отдельные столбцы в вашем датафрейме. Таким образом, вы сможете выделить значения odchylka.sr (предположительно название переменной в вашей функции) в отдельный столбец перед столбцом ‘out’.

Вот пример кода, который иллюстрирует это:

library(dplyr)
library(purrr)
library(tidyr)

# Предположим, что ваша функция model.ARIMA.RF.fct выглядит так:
model.ARIMA.RF.fct <- function(l.obs.pomin) {
  # Здесь вы выполняете расчеты и создаете ggplot
  odchylka.sr <- l.obs.pomin + rnorm(1)  # пример вычислений
  ggpl <- ggplot(data.frame(x = 1:10, y = rnorm(10)), aes(x = x, y = y)) + geom_line()  # пример графика
  wynik.lst <- list(odchylka.sr = odchylka.sr, ggpl = ggpl) 
  return(wynik.lst)
}

# Создание датафрейма и использование pmap_df для получения результатов
ARIMA.RF.cwu.wyniki <- data.frame(
  l.obs.pomin = c(52, 69, 136, 217)
) %>%
  mutate(
    out = pmap(list(l.obs.pomin), model.ARIMA.RF.fct)
  ) %>%
  unnest_wider(out)  # Разделяем список на отдельные столбцы

# Переименование столбцов для удобства
colnames(ARIMA.RF.cwu.wyniki) <- c("l.obs.pomin", "odchylka.sr", "ggpl")

# Теперь у вас есть odchylka.sr в отдельном столбце перед 'out'
print(ARIMA.RF.cwu.wyniki)

В этом примере:

  1. Функция model.ARIMA.RF.fct возвращает список, содержащий odchylka.sr и ggplot объект.
  2. Мы используем pmap для применения функции к вектору l.obs.pomin, и сохраняем результат в столбец out.
  3. С помощью unnest_wider() мы извлекаем каждый элемент списка (odchylka.sr и ggplot) в отдельные столбцы.
  4. После этого вы можете переименовать столбцы для удобства.

Важно отметить, что ggplot объект не может быть отображён в датафрейме, но при необходимости, его можно сохранить отдельно или визуализировать корректно после обработки данных.

Если у вас возникнут дополнительные вопросы или потребуется больше уточнений, не стесняйтесь спрашивать!

Оцените материал
Добавить комментарий

Капча загружается...