我有一个数据框(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
答案 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