Могу ли я ссылаться на имена других аргументов в именованном аргументе dplyr :: funs? - PullRequest
0 голосов
/ 04 ноября 2018

Рассмотрим следующее:

library(tidyverse)

df <- tibble(x = rnorm(100), y = rnorm(100, 10, 2), z = x * y)

df %>% 
mutate_all(funs(avg = mean(.), dev = sd(.), scaled = (. - mean(.)) / sd(.)))

Есть ли способ избежать двухкратного вызова mean и sd, ссылаясь на столбцы avg и dev. Я имею в виду что-то вроде

df %>% 
mutate_all(funs(avg = mean(.), dev = sd(.), scaled = (. - avg) / dev))

Очевидно, что это не сработает, потому что нет столбцов avg и dev, но x_avg, x_dev, y_avg, y_dev и т. Д.

Есть ли хороший способ в funs использовать инструменты rlang для программного создания этих ссылок на столбцы, чтобы я мог ссылаться на столбцы, созданные предыдущими именованными аргументами, на funs (когда . - это x, я бы сослался на x_mean и x_dev для вычисления x_scaled и т. Д.)?

Ответы [ 3 ]

0 голосов
/ 05 ноября 2018

Это кажется немного запутанным, но это работает:

scaled <- function(col_name, x, y) {
  col_name <- deparse(substitute(col_name))
  avg <- eval.parent(as.symbol(paste0(col_name, x)))
  dev <- eval.parent(as.symbol(paste0(col_name, y)))
  (eval.parent(as.symbol(col_name)) - avg) / dev
}

df %>%
  mutate_all(funs(avg = mean(.), dev = sd(.), scaled = scaled(., "_avg", "_dev"))) 
0 голосов
/ 05 ноября 2018

Это может работать для вас:

avg <- quo(mean(.))
dev <- quo(sd(.))
res <- df %>% 
  mutate_all(funs(avg = !!avg, dev = !!dev, scaled = (. - !!avg) / !!dev))

Подтвердите, что это работает:

res0 <- df %>% 
  mutate_all(funs(avg = mean(.), dev = sd(.), scaled = (. - mean(.)) / sd(.)))
identical(res, res0)
# [1] TRUE
0 голосов
/ 05 ноября 2018

Я думаю, было бы проще, если бы вы конвертировали свои данные в длинный формат

library(tidyverse)

set.seed(111)
df <- tibble(x = rnorm(100), y = rnorm(100, 10, 2), z = x * y)

df %>% 
  gather(key, value) %>% 
  group_by(key) %>% 
  mutate(avg    = mean(value),
         sd     = sd(value),
         scaled = (value - avg) / sd)
#> # A tibble: 300 x 5
#> # Groups:   key [3]
#>    key    value     avg    sd scaled
#>    <chr>  <dbl>   <dbl> <dbl>  <dbl>
#>  1 x      0.235 -0.0128  1.07  0.232
#>  2 x     -0.331 -0.0128  1.07 -0.297
#>  3 x     -0.312 -0.0128  1.07 -0.279
#>  4 x     -2.30  -0.0128  1.07 -2.14 
#>  5 x     -0.171 -0.0128  1.07 -0.148
#>  6 x      0.140 -0.0128  1.07  0.143
#>  7 x     -1.50  -0.0128  1.07 -1.39 
#>  8 x     -1.01  -0.0128  1.07 -0.931
#>  9 x     -0.948 -0.0128  1.07 -0.874
#> 10 x     -0.494 -0.0128  1.07 -0.449
#> # ... with 290 more rows

Создано в 2018-11-04 пакетом представ. (v0.2.1.9000)

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