mutate_at в R с лямбда-функцией? - PullRequest
0 голосов
/ 13 мая 2018

У меня есть датафрейм с 100 столбцами.Каждый столбец представляет значение вероятности.

Я хочу выполнить там масштабирование, и я использую следующее преобразование:

df <- df %>%
      mutate_at(vars(specific_columns), 
                funs(function(x) {((x - min(x)) / (max(x) - min(x)))}))

Но это не работает и не выдает вывод.хочу.

Например, пример данных:

col1        col2        col3        col4        col5        
0.014492754 0.014492754 0.014492754 0.014492754 0.014492754 
0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 
0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 
0.028985507 0.028985507 0.028985507 0.028985507 0.028985507 
0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 
0.014492754 0.014492754 0.014492754 0.014492754 0.014492754 
0.014492754 0.014492754 0.014492754 0.014492754 0.014492754 
0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 
0.010989011 0.010989011 0.010989011 0.010989011 0.010989011 
0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 

Ошибка:

Ошибка в mutate_impl (.data, точки): столбец col1 isфункции неподдерживаемого типа

1 Ответ

0 голосов
/ 13 мая 2018

Попробуйте этот синтаксис вместо:

library(dplyr)
df %>% mutate_at(vars(everything()), funs(((. - min(.)) / (max(.) - min(.)))))
#>         col1      col2      col3      col4      col5
#> 1  0.5000000 0.5000000 0.5000000 0.5000000 0.5000000
#> 2  0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
#> 3  0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
#> 4  1.0000000 1.0000000 1.0000000 1.0000000 1.0000000
#> 5  0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
#> 6  0.5000000 0.5000000 0.5000000 0.5000000 0.5000000
#> 7  0.5000000 0.5000000 0.5000000 0.5000000 0.5000000
#> 8  0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
#> 9  0.3791209 0.3791209 0.3791209 0.3791209 0.3791209
#> 10 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000

funs() будет интерпретировать псевдофункцию для вас. Это помогает разобраться с двумя случаями, которые иначе не сработали бы:

  1. Имя символа функции (например, «среднее»)
  2. вызов функции с. в качестве фиктивного аргумента (как в моем примере)

Если вы уже объявили свою собственную (анонимную) функцию, вам не нужно использовать funs(), поскольку mutate_at() примет это как есть:

mutate_at(df, vars(everything()), function(x) {((x - min(x)) / (max(x) - min(x)))})

или

my_func <- function(x) {((x - min(x)) / (max(x) - min(x)))}
mutate_at(df, vars(everything()), my_func)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...