【问题标题】:Calculate mean and median for a frequency table per column (length class per group)计算每列频率表的平均值和中位数(每组的长度类别)
【发布时间】:2021-01-27 12:22:45
【问题描述】:

我有每个位置的鱼长度等级的频率表:

LK   Loc1  Loc2  Loc3    
1     13   22     0          
2     20   18     4          
3     12   21     2          
4     2     0     1          
5     1     2     0        

我想分别计算每列(位置)的平均值和中值。例如:Loc1:对于位置 1,平均值 = (13 x 1)+(20 x 2)+(3 x 12)+(2 x 4)+(5 x 1)= 2.1 LK

我真的陷入了困境,我不知道从哪里开始。有没有办法为每一列自动计算?提前谢谢你。

【问题讨论】:

    标签: r mean median frequency-distribution


    【解决方案1】:

    您可以使用weighted.mean 获取平均值

    sapply(x[-1], weighted.mean, x=x[,1])
    #    Loc1     Loc2     Loc3 
    #2.125000 2.079365 2.571429 
    

    或使用proportions

    colSums(proportions(as.matrix(x[-1]), 2) * x[,1])
    #    Loc1     Loc2     Loc3 
    #2.125000 2.079365 2.571429 
    

    rep 表示中位数。

    sapply(x[-1], function(y) median(rep(x[,1], y)))
    #Loc1 Loc2 Loc3 
    #   2    2    2 
    

    数据:

    x <- read.table(header=TRUE, text="LK   Loc1  Loc2  Loc3    
    1     13   22     0          
    2     20   18     4          
    3     12   21     2          
    4     2     0     1          
    5     1     2     0")
    

    【讨论】:

      【解决方案2】:

      假设您的数据是一个 data.frame df,平均而言

      sapply(subset(df,select=-c(LK)),function(x){mean(x*df$LK)})

      平均数和中位数

      sapply(subset(df,select=-c(LK)),function(x){c(mean(x*df$LK),median(x*df$LK))})

      但也许您正在搜索 LK 的加权平均值,每列都包含权重,在这种情况下

      sapply(subset(df,select=-c(LK)),function(x){weighted.mean(df$LK,x)})

      【讨论】:

      • 谢谢!如果数据集也有 NA 值怎么办?我的实际数据集更大,而且位置更多,也没有值。有没有办法克服这个问题?
      • @Suusie 如何处理缺失值是一种设计选择,您需要领域知识。默认方法是使用 weighted.mean(df$LK,x,na.rm=T) 删除所有缺失值。
      • 当我尝试这个时:test2
      • 我找到了!非常感谢您的帮助!
      【解决方案3】:

      这是tidyverse 解决方案。

      library(dplyr)
      library(tidyr)
      
      df1 %>%
        pivot_longer(-LK, names_to = "Loc") %>%
        group_by(Loc) %>%
        summarise(mean = mean(LK*value, na.rm = TRUE),
                  median = median(LK*value, na.rm = TRUE),
                  .groups = "drop")
      ## A tibble: 3 x 3
      #  Loc    mean median
      #  <chr> <dbl>  <int>
      #1 Loc1   20.4     13
      #2 Loc2   26.2     22
      #3 Loc3    3.6      4
      

      数据

      df1 <- read.table(text = "
      LK   Loc1  Loc2  Loc3    
      1     13   22     0          
      2     20   18     4          
      3     12   21     2          
      4     2     0     1
      5     1     2     0
      ", header = TRUE)
      

      【讨论】:

      • 这也很有效,如果我想要加权平均值而不是平均值怎么办?
      【解决方案4】:

      将第一列乘以所有剩余的列,然后使用 colMeans

      colMeans(df1$LK * df1[ -1 ])
      # Loc1 Loc2 Loc3 
      # 20.4 26.2  3.6
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-10-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多