将参数从用户提供的函数传递到聚合(统计信息)

时间:2018-11-30 14:52:32

标签: r

我正在寻找一个可以通过许多不同的变量汇总销售数据的函数。我遇到了与aggregate(by =)有关的问题。到目前为止,这是我的功能:

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 :(得分:1)

我们可以尝试使用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