отобразить списки и mutate_at, чтобы применить функцию - PullRequest
2 голосов
/ 23 марта 2020

У меня есть некоторые данные, которые я пытаюсь отобразить и выполнить некоторые вычисления. Один из списков выглядит так:

[[6]]
# A tibble: 6 x 8
   var1  var2  var3  var4  mean    sd   min   max
  <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1    30    16    27  74.7  39.1  21.0     1   165
2    28    12    18  74.3  39.1  21.0     1   165
3    25     8    12  73.8  39.1  21.0     1   165
4    33    13    20  73.4  39.1  21.0     1   165
5    48    29    32  73.0  39.1  21.0     1   165
6    59    37    47  72.6  39.1  21.0     1   165

У меня также есть вектор с именем names.

names <- c("var1", "var2", "var3", "var4")

Я хочу map и применить эту функцию ко всем переменным в names.

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

Код, который у меня сейчас есть:

scaled_data <- map(
  dat, ~mutate_at(
    .,
    vars(matches(paste(names, collapse = "|"))),
    .funs = c("Scale_Me")
    )
  )

Ожидаемый результат будет:

# A tibble: 6 x 8
   var1  var2  var3  var4  mean    sd   min   max var1_scale var2_scale
  <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1    30    16    27  74.7  39.1  21.0     1   165    xxx1     yyy1
2    28    12    18  74.3  39.1  21.0     1   165    xxx2     yyy2
3    25     8    12  73.8  39.1  21.0     1   165    xxx3     yyy3
4    33    13    20  73.4  39.1  21.0     1   165    ...      ...
5    48    29    32  73.0  39.1  21.0     1   165    
6    59    37    47  72.6  39.1  21.0     1   165    xxxN     yyyN

Например, это работает для одного переменная var1:

map(
  dat, ~mutate(.,
    var1_scaled = (var1 - min) / (max - min) 
  )
)

Данные:

dat <- list(structure(list(var1 = c(16, 52, 61, 56, 46, 30), var2 = c(7, 
28, 30, 42, 31, 16), var3 = c(17, 36, 41, 41, 35, 27), var4 = c(76.7710873995529, 
76.3531164480543, 75.935145496561, 75.5171745450677, 75.0992035935744, 
74.6812326420812), mean = c(39.1029174452609, 39.1029174452609, 
39.1029174452609, 39.1029174452609, 39.1029174452609, 39.1029174452609
), sd = c(21.0129393923035, 21.0129393923035, 21.0129393923035, 
21.0129393923035, 21.0129393923035, 21.0129393923035), min = c(1, 
1, 1, 1, 1, 1), max = c(165, 165, 165, 165, 165, 165)), row.names = c(NA, 
-6L), class = c("tbl_df", "tbl", "data.frame")), structure(list(
    var1 = c(52, 61, 56, 46, 30, 28), var2 = c(28, 30, 42, 31, 
    16, 12), var3 = c(36, 41, 41, 35, 27, 18), var4 = c(76.3531164480543, 
    75.935145496561, 75.5171745450677, 75.0992035935744, 74.6812326420812, 
    74.2632616905879), mean = c(39.1063703943161, 39.1063703943161, 
    39.1063703943161, 39.1063703943161, 39.1063703943161, 39.1063703943161
    ), sd = c(21.008257789887, 21.008257789887, 21.008257789887, 
    21.008257789887, 21.008257789887, 21.008257789887), min = c(1, 
    1, 1, 1, 1, 1), max = c(165, 165, 165, 165, 165, 165)), row.names = c(NA, 
-6L), class = c("tbl_df", "tbl", "data.frame")), structure(list(
    var1 = c(61, 56, 46, 30, 28, 25), var2 = c(30, 42, 31, 16, 
    12, 8), var3 = c(41, 41, 35, 27, 18, 12), var4 = c(75.935145496561, 
    75.5171745450677, 75.0992035935744, 74.6812326420812, 74.2632616905879, 
    73.8452907390946), mean = c(39.0972317671854, 39.0972317671854, 
    39.0972317671854, 39.0972317671854, 39.0972317671854, 39.0972317671854
    ), sd = c(21.0078807907002, 21.0078807907002, 21.0078807907002, 
    21.0078807907002, 21.0078807907002, 21.0078807907002), min = c(1, 
    1, 1, 1, 1, 1), max = c(165, 165, 165, 165, 165, 165)), row.names = c(NA, 
-6L), class = c("tbl_df", "tbl", "data.frame")), structure(list(
    var1 = c(56, 46, 30, 28, 25, 33), var2 = c(42, 31, 16, 12, 
    8, 13), var3 = c(41, 35, 27, 18, 12, 20), var4 = c(75.5171745450677, 
    75.0992035935744, 74.6812326420812, 74.2632616905879, 73.8452907390946, 
    73.4273197876013), mean = c(39.083515262499, 39.083515262499, 
    39.083515262499, 39.083515262499, 39.083515262499, 39.083515262499
    ), sd = c(21.0046980738339, 21.0046980738339, 21.0046980738339, 
    21.0046980738339, 21.0046980738339, 21.0046980738339), min = c(1, 
    1, 1, 1, 1, 1), max = c(165, 165, 165, 165, 165, 165)), row.names = c(NA, 
-6L), class = c("tbl_df", "tbl", "data.frame")), structure(list(
    var1 = c(46, 30, 28, 25, 33, 48), var2 = c(31, 16, 12, 8, 
    13, 29), var3 = c(35, 27, 18, 12, 20, 32), var4 = c(75.0992035935744, 
    74.6812326420812, 74.2632616905879, 73.8452907390946, 73.4273197876013, 
    73.009348836108), mean = c(39.065243711307, 39.065243711307, 
    39.065243711307, 39.065243711307, 39.065243711307, 39.065243711307
    ), sd = c(21.0044169232859, 21.0044169232859, 21.0044169232859, 
    21.0044169232859, 21.0044169232859, 21.0044169232859), min = c(1, 
    1, 1, 1, 1, 1), max = c(165, 165, 165, 165, 165, 165)), row.names = c(NA, 
-6L), class = c("tbl_df", "tbl", "data.frame")), structure(list(
    var1 = c(30, 28, 25, 33, 48, 59), var2 = c(16, 12, 8, 13, 
    29, 37), var3 = c(27, 18, 12, 20, 32, 47), var4 = c(74.6812326420812, 
    74.2632616905879, 73.8452907390946, 73.4273197876013, 73.009348836108, 
    72.5913778846148), mean = c(39.053170538267, 39.053170538267, 
    39.053170538267, 39.053170538267, 39.053170538267, 39.053170538267
    ), sd = c(21.0039330348987, 21.0039330348987, 21.0039330348987, 
    21.0039330348987, 21.0039330348987, 21.0039330348987), min = c(1, 
    1, 1, 1, 1, 1), max = c(165, 165, 165, 165, 165, 165)), row.names = c(NA, 
-6L), class = c("tbl_df", "tbl", "data.frame")))

1 Ответ

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

Мы можем l oop над list с map и применять к нескольким столбцам с mutate_at

library(dplyr)
library(purrr)
map(dat, ~ 
          .x %>%
                mutate_at(vars(names), list( scaled = ~ (.- min)/(max - min))))

Если нам нужно использовать Scale_Me, это нужно либо имена столбцов, переданные в качестве аргументов, либо укажите .data

Scale_Me <- function(.data, x){
   (x - .data[["min"]]) / (.data[["max"]] - .data[["min"]])
  }

map(dat, ~ 
          {tmp <- .x
          tmp %>%
                mutate_at(vars(names), list( scaled = ~Scale_Me(.data = tmp, .)))})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...