如何将mutate_all()与具有多个参数的函数一起使用

时间:2019-07-01 03:24:51

标签: r

我有一个数据框(df),我想使用R mutate_all()函数将一个带有两个参数(在我的示例中为shr())的简单函数应用于数据框的所有列。下面是一个简单的示例,其中包含3列(我的实际应用程序中有3列以上)的数据框。通过重复使用mutate函数,可以获得我想要的结果。而且我可以将mutate_all()函数与仅具有一个参数的函数一起成功使用。但是我找不到使用具有两个或多个参数的函数的mutate_all()函数来获取结果的正确方法。帮助表示赞赏。

我尝试了许多变体,并且在stackoverFlow上阅读了几个Q和A,但未能找到答案。例如,我尝试使用“如何在mutate_all中对任何函数使用多个参数?”但我无法成功解决此问题。

library(tidyverse)
df <- data.frame(a=c(1,2,3,4),b=c(3,3,2,2),c=c(2,4,3,1))
shr <- function(x,y) { 
    z <- x/y 
}
df1 <- mutate(df,a=shr(a,b),c=shr(c,b),b=shr(b,b)) # Gives the      result I want
# df2 <- mutate_all(df, shr, ... ? # How to pass column b to this function?

预期结果:

          a b         c
1 0.3333333 1 0.6666667
2 0.6666667 1 1.3333333
3 1.5000000 1 1.5000000
4 2.0000000 1 0.5000000

2 个答案:

答案 0 :(得分:2)

您可以像使用mutate_all

dplyr::mutate_all(df, list(new = ~shr(., b)))

#  a b c a_new b_new c_new
#1 1 3 2 0.333     1 0.667
#2 2 3 4 0.667     1 1.333
#3 3 2 3 1.500     1 1.500
#4 4 2 1 2.000     1 0.500

答案 1 :(得分:0)

这可以在base R

中完成
df[] <- Map(shr, df, df['b'])
df
#          a b         c
#1 0.3333333 1 0.6666667
#2 0.6666667 1 1.3333333
#3 1.5000000 1 1.5000000
#4 2.0000000 1 0.5000000

或在tidyverse

map2_df(df, df['b'], shr)
# A tibble: 4 x 3
#      a     b     c
#  <dbl> <dbl> <dbl>
#1 0.333     1 0.667
#2 0.667     1 1.33 
#3 1.5       1 1.5  
#4 2         1 0.5