首页 > 解决方案 > Dplyr 变异,列输出数量可变

问题描述

我正在尝试运行以下结构的函数:

my_fun <- function(new_var_names, input_var_names, df){

df %>%
  mutate(...)

}

生成无限数量的新变量的地方。new_var_names它们的名称使用具有可变长度的字符向量的每个元素。它们是使用字符向量中命名的变量作为输入生成的,这些变量input_var_names使用一些函数f1f2.

理想情况下,这应该在 mutate 内完成,而不使用映射或循环过程。

是否有可能适应 mutate 来做到这一点?

提前致谢。

标签: rdplyr

解决方案


这是一种使用acrossand的方法rename_at。谁知道什么时候renameacross添加功能:

my_fun <- function(new_var_names, input_var_names, df){
  df %>%
    mutate(across(.cols = one_of(input_var_names), .names = "New.{.col}",
                  ~ . * 100)) %>%
    rename_at(vars(paste0("New.",input_var_names)),~new_var_names)
}

my_fun(c("NewX1","NewX2"),c("X1","X2"),data)
          X1       X2       X3        X4     NewX1    NewX2
1  76.512308 59.52818 35.45349 53.071453 7651.2308 5952.818
2  90.432867 53.60952 55.91350 87.441985 9043.2867 5360.952
3  82.226977 39.00973 14.58712 87.100901 8222.6977 3900.973
4   8.071753 32.63577 78.70822  3.345176  807.1753 3263.577
5   1.385738 81.03024 88.79939 97.613080  138.5738 8103.024
6   6.167663  5.15003 21.20549 49.532196  616.7663  515.003
7  86.789458 37.01053 77.29167 39.527862 8678.9458 3701.053
8  58.048272 85.80310 60.03993 42.337941 5804.8272 8580.310
9  32.070415 70.09671 95.80930 10.199656 3207.0415 7009.671
10 95.987113 68.76416 16.71015 17.019112 9598.7113 6876.416

你可以用~ . * 100你想要的任何功能替换。

样本数据:

data <- data.frame(replicate(4,runif(10,1,100)))

推荐阅读