масштабирование нескольких столбцов в списках с использованием map, map2, mutate_at, summarise_at - PullRequest
0 голосов
/ 08 ноября 2019

У меня проблемы с данными scaled_assessment, которые я пытаюсь создать.

У меня есть данные временных рядов, которые я разделил на analysis и assessment. Я хочу масштабировать данные analysis и использовать эти масштабированные значения means и sd для применения к данным assessment. Я добавляю комментарии к приведенному ниже коду.

Я сталкиваюсь с проблемами, связанными с функцией mutate_at. Я хочу применить функцию масштабирования, которая берет mean и sd из данных analysis и применяет ее к данным assessment. - Для всех столбцов данных assessment.

Данные / код:

    library(rsample)
set.seed(1131)
# I create some random data
ex_data <- data.frame(row = 1:20, some_cat_var = paste("cat"), some_var = rnorm(20), some_other_var = rnorm(20))
ex_data

# I create the analysis and assessment splits - the analysis data has 10 observations the assess has 1
rolled_ex_data <- rolling_origin(ex_data,
                                 initial = 10,
                                 assess = 1, 
                                 cumulative = FALSE,
                                 skip = 0)

# My scaling function to apply to the analysis data
Scale_Me <- function(x){
  (x - mean(x, na.rm = TRUE)) / sd(x, na.rm = TRUE)
}

# This I believe "works" I collect the mean and sd from the 3rd and 4th column of the data for each split
scale_values <- map(rolled_ex_data$splits, ~ analysis(.x) %>% 
                      as_tibble(., .name_repair = "universal") %>% 
                      summarise_at(.vars = 3:ncol(.), .funs = c(mean = "mean", sd = "sd")))

# I then apply the scale function to the analysis data (to columns 3 and 4) for each split
scaled_analysis <- map(rolled_ex_data$splits, ~ analysis(.x) %>% 
                         as_tibble(., .name_repair = "universal") %>% 
                         mutate_at(.vars = 3:ncol(.), .funs = c(Scale_Me = "scale")))

# My problem is here with the mutate_at function
scaled_assessment <- map2(rolled_ex_data$splits, scale_values, ~ assessment(.x) %>% 
                            as_tibble(., .name_repair = "universal") %>% 
                            mutate_at(.vars = 3:ncol(.), .funs = c(scaled_col = (.vars - .y$mean) / .y$sd)))

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

Хорошо. Мне удалось заставить его работать для двух переменных, используя mutate.

scaled_assessment <- map2(rolled_ex_data$splits, scale_values, ~ assessment(.x) %>% 
                            #as_tibble(.x, .name_repair = "universal") %>% 
                            mutate(
                              some_var_scaled = (some_var - .y$some_var_mean) / .y$some_var_sd,
                              some_other_var_scaled = (some_other_var - .y$some_other_var_mean) / .y$some_other_var_sd
                              )
                          )

Это дает мне список из 10:

scaled_assessment[[1]]
scaled_assessment[[2]]
scaled_assessment[[3]]

> scaled_assessment[[1]]
  row some_cat_var  some_var some_other_var some_var_scaled some_other_var_scaled
1  11          cat -1.350214      -0.569947       -1.603747            -0.2836588
> scaled_assessment[[1]]
  row some_cat_var  some_var some_other_var some_var_scaled some_other_var_scaled
1  11          cat -1.350214      -0.569947       -1.603747            -0.2836588
> scaled_assessment[[2]]
  row some_cat_var some_var some_other_var some_var_scaled some_other_var_scaled
1  12          cat 2.242594      -1.195205        3.038992            -0.7670828
> scaled_assessment[[3]]
  row some_cat_var some_var some_other_var some_var_scaled some_other_var_scaled
1  13          cat 1.781132      0.9764677        1.593273              1.194117

Я хотел бы знать, как это сделатьон использует mutate_at, потому что я не знаю, сколько столбцов временных рядов мне нужно масштабировать. Здесь я использую 2 столбца some_var и some_other_var, но у меня может быть 3 или 4 столбца, поэтому я попытался использовать .vars = 3:ncol(.).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...