0

我有一个大型数据集,我想以编程方式在某些变量中应用一些转换。为了说明,假设我想将日志应用于字符向量中包含的变量。我想保留输入变量并生成一个新变量,为字符向量的每个变量添加(或附加)前缀(或后缀)。由于几行代码相当于一千段代码,因此我的主要目标df_aim是以较少重复的方式获得结果,例如在df_syntax.

代表

library(tidyverse)
data(mtcars)

vars_to_transf <- c("disp", "hp", "drat")

# these results 
df_aim <- mtcars %>% 
    mutate(
        ln_disp =  log(disp), 
        ln_hp   =  log(hp),
        ln_drat =  log(drat)
    )

# with something like this syntax 
df_syntax <- mtcars %>% 
    mutate(across(all_of(vars_to_transf), .fns =  log))
> head(df_aim)
                   mpg cyl disp  hp drat    wt  qsec vs am gear carb ln_disp ln_hp ln_drat
Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4   5.075 4.700   1.361
Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    4   5.075 4.700   1.361
Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1    4    1   4.682 4.533   1.348
Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3    1   5.553 4.700   1.125
Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2   5.886 5.165   1.147
Valiant           18.1   6  225 105 2.76 3.460 20.22  1  0    3    1   5.416 4.654   1.015
> head(df_syntax)
                   mpg cyl  disp    hp  drat    wt  qsec vs am gear carb
Mazda RX4         21.0   6 5.075 4.700 1.361 2.620 16.46  0  1    4    4
Mazda RX4 Wag     21.0   6 5.075 4.700 1.361 2.875 17.02  0  1    4    4
Datsun 710        22.8   4 4.682 4.533 1.348 2.320 18.61  1  1    4    1
Hornet 4 Drive    21.4   6 5.553 4.700 1.125 3.215 19.44  1  0    3    1
Hornet Sportabout 18.7   8 5.886 5.165 1.147 3.440 17.02  0  0    3    2
Valiant           18.1   6 5.416 4.654 1.015 3.460 20.22  1  0    3    1

如果这个问题重复,我感谢您的关注并道歉。

4

2 回答 2

2

您可以使用list

mtcars %>% 
    mutate(across(vars_to_transf, list(log = log)))

如果您尝试使用多个功能,则使用listand the.names将起作用:

mtcars %>% 
    mutate(across(vars_to_transf, 
                  list(log = log, sqrt = sqrt), 
                  .names = "{.col}_{.fn}"))
于 2021-03-08T20:52:33.267 回答
1

答案就在帮助文件中?dplyr::across()。争论.names会解决它。

.names

描述如何命名输出列的粘合规范。这可以使用 {.col} 代表选定的列名,使用 {.fn} 代表正在应用的函数的名称。对于单函数情况,默认值 (NULL) 等效于“{.col}”,对于 .fns 使用列表的情况,默认值 (NULL) 等效于“{.col}_{.fn}”。

mtcars %>% mutate(
    across(vars_to_transf, .fns =  log, .names = "ln_{vars_to_transf}")
)
于 2021-03-08T20:53:39.650 回答