简体   繁体   English

将 dplyr mutate_at 与自定义函数一起使用

[英]Using dplyr mutate_at with custom function

I want to take two variables from a table and divide them by a third variable and add these computations as two new columns.我想从表中取出两个变量并将它们除以第三个变量并将这些计算添加为两个新列。 The mutate_at gets me very close but within the custom function, f below, I want to access another column in the data set. mutate_at让我非常接近,但在自定义函数f下面,我想访问数据集中的另一列。 Any suggestions or alternate tidy tools approaches?任何建议或替代的整洁工具方法?

library(dplyr)
# this works fine but is NOT what I want
f <- function(fld){
  fld/5
}

# This IS what I want where wt is a field in the data
f <- function(fld){
  fld/wt
}

mutate_at(mtcars, .vars = vars(mpg, cyl), .funs = funs(xyz = f))

# This works but is pretty clumsy
f <- function(fld, dat) fld/dat$wt
mutate_at(mtcars, .vars = vars(mpg, cyl), .funs = funs(xyz = f(., mtcars)))

# This is closer but still it would be better if the function allowed the dataset to be submitted to the function without restating the name of the dataset

f <- function(fld, second){
  fld/second
}

mutate_at(mtcars, .vars = vars(mpg, cyl), .funs = funs(xyz = f(., wt)))
library(tidyverse)
f <- function(num, denom) num/denom

mtcars %>% 
  mutate_at(vars(mpg, cyl), f, denom = quote(wt))

Although in this specific example, a custom function isn't needed.尽管在此特定示例中,不需要自定义函数。

mtcars %>% 
  mutate_at(vars(mpg, cyl), `/`, quote(wt))

Updated version for dplyr 1.0.6: dplyr 1.0.6 的更新版本:

mtcars %>% 
  mutate(across(c(mpg, cyl), `/`, wt))

Maybe something like this?也许是这样的?

f <- function(fld,var){
    fld/var
}

mtcars %>%
    mutate_at(vars(mpg,cyl), .funs = funs(xyz = f(.,wt)))

Edit (2020-08-24):编辑 (2020-08-24):

As of second semester of 2020, with the launch of dplyr 1.0.0, mutate_at has been superseded by combining mutate with the across function:由于2020年下半年,随着推出dplyr 1.0.0的, mutate_at已被取代结合mutateacross功能:

mtcars %>%
    mutate(across(c(mpg, cyl), ~ f(.,wt), .names = "{col}_xyz"))

为什么不简单

mutate(mtcars, mpg2 = mpg / wt, cyl2 = cyl / wt)

There is a cur_data() function that will help make the mutate_at() call more compact because you will not have to specify a second argument to the function that is being applied to each column:有一个cur_data()函数将有助于使mutate_at()调用更加紧凑,因为您不必为应用于每一列的函数指定第二个参数

f <- function(fld){
  fld / cur_data()$wt
}
mutate_at(mtcars, .vars=vars(mpg, cyl), .funs=funs(xyz = f))

Additional notes:附加说明:

  1. If you need the function to reference a grouping variable , use cur_data_all()如果您需要该函数来引用分组变量,请使用cur_data_all()
  2. mutate_at is now superseded by mutate(.data, across()) , so it would be better to do mutate_at现在被mutate(.data, across()) mutate_at mutate(.data, across())取代,所以最好这样做
mtcars %>% mutate(across(.cols=c(mpg, cyl), .fns=f, .names='{.col}_xyz'))

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM