Более эффективный способ получения средних значений по нескольким спискам - PullRequest
2 голосов
/ 23 марта 2020

У меня есть некоторые данные, где я использую пакет rsample для создания скользящего windows (я использую набор данных iris здесь). Набор данных rolling_iris содержит несколько списков.

Я хотел бы вычислить min, max, mean и sd каждого из списков. То есть в split 1 вычислите min по первым 4 столбцам и т.д. c. Первоначально я делал это путем сопоставления разбиений и использования pivot_longer для перегруппировки данных, а затем вычисления статистики, наконец, используя pivot_wider, чтобы вернуть данные в исходную форму. Это довольно медленно.

library(dplyr)
library(purrr)

iris
rolling_iris <- rsample::rolling_origin(iris, initial = 10, assess = 1, cumulative = FALSE, skip = 0)

rolling_iris_statistics <- map(rolling_iris$splits, ~analysis(.x) %>%
      pivot_longer(cols = 1:4) %>%
      mutate(
        min = min(value),
        max = max(value),
        mean = mean(value),
        sd = sd(value)
      ) %>% 
        group_by(name) %>% 
        mutate(rowID = row_number()) %>% 
        pivot_wider(names_from = name, values_from = value)
    )

Я хотел бы отобразить каждый из списков и вычислить приведенную выше статистику. Затем, как только это будет сделано, масштабируйте analysis с помощью следующей функции.

Scale_Me <- function(x){
  (x - min(x)) / (max(x) - min(x))
}

Дополнительно:

rolling_iris_analysis <- map(rolling_iris$splits, ~analysis(.x))
rolling_iris_assessment <- map(rolling_iris$splits, ~assessment(.x))

РЕДАКТИРОВАТЬ:

Мне удалось вычислить следующее ( Я не уверен, что это "быстрее")

analysis <- map(rolling_iris$splits, ~analysis(.x))
map(analysis, ~select(., c(1:4)) %>% as.matrix %>% mean())

1 Ответ

0 голосов
/ 23 марта 2020

Приведенный ниже код поднабора в каждый кадр данных Итак, rolling_iris_dfs - это список фреймов данных. Затем вы можете перебирать каждый фрейм данных и вычислять статистику.

rolling_iris_dfs <- map(seq(1, length(rolling_iris[[1]])), ~rolling_iris[[1]][[.x]]$data) 

rolling_iris_stats <- map(rolling_iris_dfs, ~analysis(.x) %>%
      pivot_longer(cols = 1:4) %>%
      mutate(
        min = min(value),
        max = max(value),
        mean = mean(value),
        sd = sd(value)
      ) %>% 
        group_by(name) %>% 
        mutate(rowID = row_number()) %>% 
        pivot_wider(names_from = name, values_from = value)
    )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...