创建函数以基于列级别获取均值

时间:2019-05-31 14:38:26

标签: r permutation

我正在尝试创建一个函数,该函数根据另一列的级别为我提供方法。我知道R有很多功能可以执行相同的操作,但是由于我打算使用引导程序包,因此我需要提供一个要使用的功能(该程序包似乎没有预先定义的功能,例如如“ FUN =平均值”)。很抱歉有这样一个基本问题!

我搜索了有关R中函数创建基础的页面,但找不到我想要的东西。这是我想要使用虹膜数据集并轻按的示例:

data(iris)
with(iris, tapply(Sepal.Length, Species, mean))

因此,我想要一个函数,该函数为我提供X data.table(在此情况下为虹膜)的每个级别(种类)的平均值(Sepal.Length)。

setosa versicolor  virginica 
 5.006    5.936      6.588

3 个答案:

答案 0 :(得分:2)

您可以在tapply周围使用包装函数,并将FUN设置为mean。像这样:

func <- function(data, x, y) {
  tapply(data[[x]], data[[y]], mean) 
}

然后使用它,就像:

func(iris, 'Sepal.Length', 'Species')
#    setosa versicolor  virginica 
#     5.006      5.936      6.588

答案 1 :(得分:2)

带有tidyverse

的另一个选项
f1 <- function(data, grpCol, valueCol) {
        grpCol <- enquo(grpCol)
        valueCol <- enquo(valueCol)
        data %>%
            group_by(!! grpCol) %>%
            summarise(Mean = mean(!! valueCol))
 }

f1(iris, Species, Sepal.Length)
# A tibble: 3 x 2
#  Species     Mean
#  <fct>      <dbl>
#1 setosa      5.01
#2 versicolor  5.94
#3 virginica   6.59

答案 2 :(得分:2)

如果要按组引导均值,则可以按照以下几行进行操作。

这是您的代码,即Species组的完整数据集。

res1 <- with(iris, tapply(Sepal.Length, Species, mean))

现在有一个引导功能及其应用。

library(boot)

bootMeans <- function(data, indices, val, catg, na.rm = FALSE){
  val <- deparse(substitute(val))
  catg <- deparse(substitute(catg))
  d <- data[indices, ]
  tapply(d[[val]], d[[catg]], mean, na.rm = na.rm)
}

set.seed(1234)
b <- boot(iris, bootMeans, R = 1000,
          val = Sepal.Length, catg = Species, na.rm = TRUE)

identical(b$t0, res1)
#[1] TRUE

colMeans(b$t)
#[1] 5.006788 5.940504 6.588357