dplyr 中 mutate_all 函数的问题

Problem with mutate_all function in dplyr

我不确定这是否是一个愚蠢的问题,但我现在需要提示。提前致歉。

所以我有一个随机数据帧 df,我想使用 mutate_at() 函数。

x1<-rpois(20,5)
x2<-rpois(20,5)
x3<-rpois(20,2)
df1<-data.frame(x1,x2,x3)

如果我像这样将整个数据帧除以一列,这项工作非常好:

library(dplyr)
df1%>%mutate_at(vars(x1:x3),list(All_by_x3=~./x3))

但我真正想要的是 x3 除以数据框的每一列。所以我想要 x3 作为分子并循环遍历分母中的不同列。我逻辑上尝试的是:

df1%>%mutate_at(vars(x1:x3),list(All_by_x3= x3/ ~.))

但它不起作用。 感觉好像有简单的答案,但是我看不到。

感谢您的帮助。

可能的解决方案,基于dplyr

library(dplyr)

df1 %>% 
  mutate(across(x1:x2, ~ x3/.x, .names = "x3_{.col}"))

#>    x1 x2 x3     x3_x1      x3_x2
#> 1   2  4  1 0.5000000 0.25000000
#> 2   7  3  2 0.2857143 0.66666667
#> 3   8 11  1 0.1250000 0.09090909
#> 4   7  4  2 0.2857143 0.50000000
#> 5   3  7  0 0.0000000 0.00000000
#> 6   6  6  3 0.5000000 0.50000000
#> 7   2  7  2 1.0000000 0.28571429
#> 8   7  6  1 0.1428571 0.16666667
#> 9   1  5  0 0.0000000 0.00000000
#> 10  4  7  6 1.5000000 0.85714286
#> 11  3  4  2 0.6666667 0.50000000
#> 12  4  3  2 0.5000000 0.66666667
#> 13  2  1  2 1.0000000 2.00000000
#> 14  2  4  0 0.0000000 0.00000000
#> 15  6  4  1 0.1666667 0.25000000
#> 16  5  5  4 0.8000000 0.80000000
#> 17  7  5  6 0.8571429 1.20000000
#> 18  5  4  3 0.6000000 0.75000000
#> 19  6  5  3 0.5000000 0.60000000
#> 20  5  3  1 0.2000000 0.33333333