将列作为函数的一部分

Taking column means as part of a function

我有以下功能:

estimate = function(df, y_true) {
        
        R = nrow(df)
        
        y_estimated = apply(df, 2, mean)
        
        ((sqrt( (y_estimated - y_true)^2 / R)) / y_true) * 100
}


df = iris[1:10,2:4]
y_true = c(3, 1, 0.4)
estimate(df = df, y_true = y_true)

user:bird 提供了这个并且效果很好,但是,我还需要按组找到方法。因此,如果我们将 df 更改为 df= iris[,2:5],我该如何按 Species 找到要在函数中使用的每一列的平均值。我认为这样的事情会奏效 - 但不是运气:

estimate = function(df, y_true, group) {
  
  R = nrow(df)
  
  y_estimated = df %>% group_by(group) %>% apply(df, 2, mean)
  
  ((sqrt( (y_estimated - y_true)^2 / R)) / y_true) * 100
}



df = iris[2:5]
y_true = c(3, 1, 0.4)
group=df$Species 

estimate(df = df, y_true = y_true, group=group)

使用 colMeans 也没有用。

这是此 的扩展,它解释了每个变量的用途。

无需修改您的函数,您可以保留函数 as-is 并将其应用到您的数据中 group-wise。如果您使用 group_by,然后使用 group_modify,您传递给 group_modify 的函数的输入是数据框,该特定组中的行的子集。

estimate = function(df, y_true) {
        
        R = nrow(df)
        
        y_estimated = apply(df, 2, mean)
        
        ((sqrt( (y_estimated - y_true)^2 / R)) / y_true) * 100
}


df = iris[2:5]
y_true = c(3, 1, 0.4)

library(dplyr, warn.conflicts = FALSE)

df %>% 
  group_by(Species) %>% 
  group_modify(~ as.data.frame.list(estimate(., y_true)))
#> # A tibble: 3 × 4
#> # Groups:   Species [3]
#>   Species    Sepal.Width Petal.Length Petal.Width
#>   <fct>            <dbl>        <dbl>       <dbl>
#> 1 setosa           2.02          6.53        5.44
#> 2 versicolor       1.08         46.1        32.7 
#> 3 virginica        0.123        64.4        57.5

reprex package (v2.0.1)

于 2022-02-24 创建