Передать аргумент из предоставленной пользователем функции в агрегат (статистика) - PullRequest
0 голосов
/ 30 ноября 2018

Я хочу создать функцию, которая объединяет данные о продажах по множеству различных переменных.Я сталкиваюсь с препятствием с совокупности (по =).Вот моя функция на данный момент:

func <- function(x, x2, statfunc) {

  PT <- c(1,5,3,5,4,8,3,1,5,6,1,5,5,6,1,2,3,1,5,1)
  SH <- c(7,7,3,1,1,1,1,4,4,6,6,7,7,1,1,1,3,2,1,3)
  SaleRatio <- c(0.85, 0.92, 0.89, 0.88, 0.86, 1.08, 1.15, 1.03, 0.95, 1.01, 1.36, 0.96, 1.03, 0.95, 0.90, 1.01, 0.96, 0.95, 0.81, 1.29)

  study <- data.frame(PT, SH, SaleRatio)

  study <- select(study, x2, SaleRatio)

  study <- aggregate(study,
              by = list(x),
              FUN = statfunc)
print(study) 
}

Когда я пытаюсь запустить формулу с помощью:

func(x = "study$PT", x2 = "PT", statfunc = median)

Я получаю ошибку:

Error in aggregate.data.frame(study, by = list(x), FUN = statfunc) : 
  arguments must have same length 

Яожидая этого:

  Group.1 PT SaleRatio
1       1  1     0.990
2       2  2     1.010
3       3  3     0.960
4       4  4     0.860
5       5  5     0.935
6       6  6     0.980
7       8  8     1.080

Приведенные выше результаты получены из точной той же формулы, только путем ручного ввода аргументов вместо того, чтобы позволить функции передавать их.

Этот пользовательпредоставленная функция в конечном итоге будет применена ко многим различным переменным и агрегатным функциям, а также к гораздо большему набору данных.

Может ли кто-нибудь помочь?

1 Ответ

0 голосов
/ 30 ноября 2018

Мы можем попробовать с tidyverse

library(dplyr)
func <- function(x, x2, statfunc) {

  PT <- c(1,5,3,5,4,8,3,1,5,6,1,5,5,6,1,2,3,1,5,1)
  SH <- c(7,7,3,1,1,1,1,4,4,6,6,7,7,1,1,1,3,2,1,3)
  SaleRatio <- c(0.85, 0.92, 0.89, 0.88, 0.86, 1.08, 1.15, 1.03, 0.95,
        1.01, 1.36, 0.96, 1.03, 0.95, 0.90, 1.01, 0.96, 0.95, 0.81, 1.29)

  study <- data.frame(PT, SH, SaleRatio)

 study %>% 
      select(x2, SaleRatio) %>%
      group_by_at(x) %>%
      summarise_all(statfunc)

}


func("PT", "PT", median)
# A tibble: 7 x 2
#     PT SaleRatio
#  <dbl>     <dbl>
#1     1     0.99 
#2     2     1.01 
#3     3     0.96 
#4     4     0.86 
#5     5     0.935
#6     6     0.98 
#7     8     1.08 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...