2

我正在尝试使用 dplyr 将数据框中的多个列“居中”,但我不断收到“二进制运算符的非数字参数”评估错误。我认为这是因为当我的函数需要一个裸变量名时,我试图传递一个字符串。但是,使用 syms() 函数并没有帮助。

center <- function(var) {
  var <- enquo(var)
  var_ctrd <- paste0(quo_name(var), "_ctrd")
  dataset <- dataset %>% 
    group_by(Gender) %>% 
    mutate(!! var_ctrd := !! var - mean(!! var, na.rm = TRUE))
}

# Pull out character vector of modifier names
mod_names <- dataset %>% 
  select(NeckLengthCm:FlexExtDiff_Peak_abs) %>% 
  colnames()

# Iterate over modifiers
walk(syms(mod_names), center)

有谁知道如何解决这个问题或者是否有更好的解决方案?

4

2 回答 2

5

您可以使用mutate_at()变量名称向量将变量子集居中

# Only center a subset
vars <- colnames(mtcars)[1:4]

mtcars %>% 
  mutate_at(vars, scale, scale = FALSE)
于 2018-10-30T23:39:56.210 回答
0

我有另一个建议mutate_at

mtcars %>% 
  mutate_at(.vars = colnames(mtcars)[1:4], 
            .funs = list("scaled" = scale))

在这里你得到你想要的。带有后缀的新列中的缩放变量。

   mpg cyl disp  hp drat    wt  qsec vs am gear carb mpg_scaled cyl_scaled disp_scaled  hp_scaled
1 21.0   6  160 110 3.90 2.620 16.46  0  1    4    4  0.1508848 -0.1049878 -0.57061982 -0.5350928
2 21.0   6  160 110 3.90 2.875 17.02  0  1    4    4  0.1508848 -0.1049878 -0.57061982 -0.5350928
3 22.8   4  108  93 3.85 2.320 18.61  1  1    4    1  0.4495434 -1.2248578 -0.99018209 -0.7830405
4 21.4   6  258 110 3.08 3.215 19.44  1  0    3    1  0.2172534 -0.1049878  0.22009369 -0.5350928
5 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2 -0.2307345  1.0148821  1.04308123  0.4129422
6 18.1   6  225 105 2.76 3.460 20.22  1  0    3    1 -0.3302874 -0.1049878 -0.04616698 -0.6080186
于 2020-10-28T13:26:47.750 回答