首页 > 解决方案 > 在R中设计导出加权平均值的函数

问题描述

我正在设计一个函数来区分它们是否有重复的值。如果是这样,他们应该提出表格,唯一值的排序值,重复值的排序值,向量的平均值,唯一值和重复值的平均值,最后是加权值。请看一下这段代码,让我知道哪一点是错误的。

avg<-function(...){
  x<-c(...)
  cond<-duplicated(x)
  if (any(cond)) {
    table(x)
    sort(unique(x))
    sort(x[cond==T])
    mean(x)
    mean(unique(x))
    mean(sort(x[cond==T])) 
    for(i in 1:length(unique(x))) {
      sort(unique(x))[i]*(as.integer(table(x))[i]/length(x))
    }
  } else{sum(x)/length(x)
  }
}

avg(2,4,3,1,2,1)

标签: rfunction

解决方案


您的代码的一个问题是,当有任何重复时所做的每个计算都会被覆盖。以下代码返回一个命名的解决方案列表:

   weighted.average <- function(x){
  
  t <- table(x)
  t.values <- as.integer(names(t))
  frequency <- as.integer(t)
  weights <- frequency/length(x)
  sum(weights * t.values)

}

avg<-function(...){
  x<-c(...)
  cond<-duplicated(x)
  if (any(cond)) {
    
    return_value <- list("Table_x" = table(x),
                         "unique_x" = sort(unique(x)),
                         "duplicated_x" = sort(x[cond==T]),
                         "mean_x" = mean(x),
                         "mean_unique_x" = mean(unique(x)),
                         "mean_duplicated_x" = mean(sort(x[cond==T])),
                        "weighted_average" = weighted.average(x)
                        )
    } else {
    
    return_value <- sum(x)/length(x)
    
    }

  }

推荐阅读