在单个mutate()语句中组合多个cross(),同时控制R中的变量名称

在单个mutate()语句中组合多个cross(),同时控制R中的变量名称,r,dplyr,tidyverse,mutate,across,R,Dplyr,Tidyverse,Mutate,Across,我有以下数据帧: df = data.frame(a = 10, b = 20, a_sd = 2, b_sd = 3) a b a_sd b_sd 1 10 20 2 3 我想计算a/a_sd,b/b_sd,并将结果添加到数据帧中,并将它们命名为ratio_a,ratio_b。在我的数据框架中,我有很多变量,所以我需要一个“广泛”的解决方案。我试过: df %>% mutate( across(one_of( c('a','b')))/across(ends

我有以下数据帧:

df = data.frame(a = 10, b = 20, a_sd = 2, b_sd = 3)

   a  b a_sd b_sd
1 10 20    2    3
我想计算a/a_sd,b/b_sd,并将结果添加到数据帧中,并将它们命名为ratio_a,ratio_b。在我的数据框架中,我有很多变量,所以我需要一个“广泛”的解决方案。我试过:

df %>% 
  mutate( across(one_of( c('a','b')))/across(ends_with('_sd'))) 
这使得:

  a        b a_sd b_sd
1 5 6.666667    2    3

因此,这是可行的,但新的价值观取代了旧的价值观。如何将结果添加到数据框并控制新名称?

您可以在其中使用
.names
参数


为什么要在第一个Cross()中指定.names参数而不是在第二个中指定?老实说,我不知道dplyr在内部是如何工作的,但更直观的做法是将其放在第一个
中。事实上,如果您将代码放在第二个
中,代码不会返回所需的输出
df %>% 
  mutate(across(one_of(c('a','b')), .names = 'ratio_{col}')/across(ends_with('_sd'))) 
#    a  b a_sd b_sd ratio_a  ratio_b
# 1 10 20    2    3       5 6.666667