【问题标题】:R function to calculate mean/median of top highest valuesR函数计算最高值的平均值/中位数
【发布时间】:2014-07-20 02:21:15
【问题描述】:

我有一个包含 2 列的数据框,其中一列带有数值,一列带有名称。该名称会重复,但每次都有不同的值。

Data <- data.frame(
Value = c(1:10),
Name = rep(LETTERS, each=4)[1:10])

我想编写一个函数,它为每个名称获取 3 个最高数字并计算平均值和中位数(如果不存在 3 个值,则抛出 NA),然后获取每个名称的所有值并计算均值和中位数。 我最初的尝试是这样的:

my.mean <- function (x,y){
  top3.x  <- ifelse(x > 3 , NA, x)
  return(mean(top3.x), median(top3.x))
}

我们将不胜感激任何有关如何改进这一点的提示。

【问题讨论】:

    标签: r function


    【解决方案1】:

    我可能会为此推荐by

    快速组合起来的东西可能看起来像这样(如果我正确理解了您的问题):

    myFun <- function(indf) {
      do.call(rbind, with(indf, by(Value, Name, FUN=function(x) {
        Vals <- head(sort(x, decreasing=TRUE), 3)
        if (length(Vals) < 3) {
          c(Mean = NA, Median = NA)
        } else {
          c(Mean = mean(Vals), Median = median(Vals))
        }
      })))
    }
    myFun(Data)
    #   Mean Median
    # A    3      3
    # B    7      7
    # C   NA     NA
    

    请注意,这种形式的函数并不是很有用,因为函数中硬编码了多少参数。只有当您的数据采用您共享的形式时,它才真正有用。

    【讨论】:

    • 哈哈,你拿着这个。 :)
    • @RichardScriven,实际上,正如我在回答中指出的那样,我认为这里不需要函数。我把它主要是希望它可以作为 OP,以防他们想通过查看一些示例函数来学习。
    • 不错的一个!这正是我想要的,一个学习的例子。非常感谢。
    • 在这种情况下,median(Vals) 将与 Vals[2] 相同
    【解决方案2】:

    这是一个data.table 解决方案,假设您的数据中没有任何其他 NA:

    require(data.table)  ## 1.9.2+
    setDT(Data)          ## convert to data.table
    Data[order(Name, -Value)][, list(m1=mean(Value[1:3]), m2=median(Value[1:3])), by=Name]
    
    #    Name m1 m2
    # 1:    A  3  3
    # 2:    B  7  7
    # 3:    C NA NA
    

    【讨论】:

    • 我喜欢你完成它的方式,但问题是,value 列是否采用 distinct 最高值,如果该列包含的相似最高值很少?如果不是,如何仅采用 top unique 值来获取平均值? @Arun
    【解决方案3】:

    使用dplyr

     library(dplyr)
     myFun1 <- function(dat){
     dat %>%
     group_by(Name)%>%
     arrange(desc(Value))%>%
     mutate(n=n(), Value=ifelse(n<=3, NA_integer_, Value))%>%
     summarize(Mean=mean(head(Value,3)), Median=median(head(Value,3)))
     }
    
      myFun1(Data)
     #Source: local data frame [3 x 3]
    
     # Name Mean Median
     #1    A    3      3
     #2    B    7      7
     #3    C   NA     NA
    

    【讨论】:

    • 在您的回答中,value 列是否采用 distinct 最高值,以防value 列几乎没有相似的最高值?如果不是,如何只取最高的唯一值来获取平均值?为什么我需要mutate()? @akrun
    • @temp 它没有采用distinct 值。为此,您需要在 mutate 步骤之后使用 %&gt;% distinct(Name, Value)
    猜你喜欢
    • 2017-09-26
    • 1970-01-01
    • 2021-02-14
    • 2019-10-08
    • 2013-11-05
    • 2022-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多