Создание функции для получения средств на основе уровней столбцов - PullRequest
0 голосов

Я пытаюсь создать функцию, которая дает мне средства, основанные на уровнях другого столбца.Я знаю, что в R есть много функций, которые делают то же самое, но, поскольку я планирую использовать загрузочный пакет, как я мог видеть, мне нужно предоставить функцию, которая будет использоваться (этот пакет не имеет предопределенных функций, таких каккак "FUN = означать").Извините за такой простой вопрос!

Я искал на страницах об основах создания функций в R, но не смог найти то, что я хочу.Вот пример того, что я хочу использовать с помощью набора данных iris и tapply:

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

Итак, я хочу функцию, которая дает мне средства (Sepal.Length) каждого уровня (Species) X data.table (в данном случае радужная оболочка).

setosa versicolor  virginica 
 5.006    5.936      6.588

Ответы [ 3 ]

2 голосов
/ 31 мая 2019

Другой вариант с 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 голосов
/ 31 мая 2019

Если вы хотите загрузить средства по группам, вы можете сделать что-то, следуя приведенным ниже строкам.

Это ваш код, средство по группе 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
2 голосов
/ 31 мая 2019

Вы можете сделать функцию обёртки вокруг 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...