带有lambda函数的R中的mutate_at?

时间:2018-05-13 07:22:07

标签: r dataframe dplyr scaling

我有一个包含100列的数据框。每列代表一个概率值。

我想在那里进行缩放,我正在使用以下转换:

df <- df %>%
      mutate_at(vars(specific_columns), 
                funs(function(x) {((x - min(x)) / (max(x) - min(x)))}))

但它没有效果,也没有产生我想要的输出。

例如,样本数据是:

col1        col2        col3        col4        col5        
0.014492754 0.014492754 0.014492754 0.014492754 0.014492754 
0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 
0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 
0.028985507 0.028985507 0.028985507 0.028985507 0.028985507 
0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 
0.014492754 0.014492754 0.014492754 0.014492754 0.014492754 
0.014492754 0.014492754 0.014492754 0.014492754 0.014492754 
0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 
0.010989011 0.010989011 0.010989011 0.010989011 0.010989011 
0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 

错误:

  

mutate_impl(.data,dots)中的错误:列col1不受支持   类型函数

1 个答案:

答案 0 :(得分:2)

请尝试使用以下语法:

library(dplyr)
df %>% mutate_at(vars(everything()), funs(((. - min(.)) / (max(.) - min(.)))))
#>         col1      col2      col3      col4      col5
#> 1  0.5000000 0.5000000 0.5000000 0.5000000 0.5000000
#> 2  0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
#> 3  0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
#> 4  1.0000000 1.0000000 1.0000000 1.0000000 1.0000000
#> 5  0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
#> 6  0.5000000 0.5000000 0.5000000 0.5000000 0.5000000
#> 7  0.5000000 0.5000000 0.5000000 0.5000000 0.5000000
#> 8  0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
#> 9  0.3791209 0.3791209 0.3791209 0.3791209 0.3791209
#> 10 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000

funs()为您解释伪函数。它有助于处理两个无法正常工作的案例:

  1. 功能的字符名称(例如,&#34;表示&#34;)
  2. 用函数调用函数。作为一个虚拟参数(如我的例子)
  3. 如果您已经声明了自己的(匿名)功能,则无需使用funs(),因为mutate_at()将按原样接受此功能:

    mutate_at(df, vars(everything()), function(x) {((x - min(x)) / (max(x) - min(x)))})
    

    my_func <- function(x) {((x - min(x)) / (max(x) - min(x)))}
    mutate_at(df, vars(everything()), my_func)