r - 在 dplyr::funs 的命名参数中,我可以引用其他参数的名称吗?

标签 r dplyr rlang

考虑以下:

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(.)))

有没有办法避免调用meansd通过引用 avg 两次和 dev列。我的想法是
df %>% 
mutate_all(funs(avg = mean(.), dev = sd(.), scaled = (. - avg) / dev))

显然这行不通,因为没有列 avgdev , 但是 x_avg , x_dev , y_avg , y_dev , ETC。

有没有好办法,内funs使用 rlang以编程方式创建这些列引用的工具,以便我可以将由先前命名参数创建的列引用到 funs (当 .x 时,我会引用 x_meanx_dev 来计算 x_scaled 等等)?

最佳答案

我认为如果您将数据转换为长格式会更容易

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 由 reprex package (v0.2.1.9000)

关于r - 在 dplyr::funs 的命名参数中,我可以引用其他参数的名称吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53143522/

相关文章:

r - 使用 na.omit 和complete.cases 后,summary 仍然显示 NA

r - 使用 dplyr 进行交互频率计数,必须包括零计数

r - 如何 reshape 数据,使 R 中的行成为列?

r - dplyr 总结输出 - 如何保存它

r - 如何使用 tidyselect 助手初始化变量?

r - 编写从 dplyr 上下文访问数据的函数

r - 使用 dplyr : Renaming a column with variable using glue syntax 编程

r - 向 quantmod::chart_Series 添加垂直线

r - Blogdown 在为网站构建站点时不显示地 block

r - dnorm 是如何工作的?