【问题标题】:R: Find average for column excluding that row's value from the averageR:从平均值中查找不包括该行值的列的平均值
【发布时间】:2020-05-12 17:03:20
【问题描述】:

我有一些看起来像这样的数据:

ID isnr MS  position
20  332 LV  0
21  332 MT  100
22  332 NL  0
23  332 PL  100
24  332 PT  100
25  332 RO  100
26  332 SE  0
27  332 SI  0
28  332 SK  0
29  332 UK  0
30  333 AT  0
31  333 BE  0
32  333 BU  0
33  333 COM 80
34  333 CR  100
35  333 CY  100
36  333 CZ  0
37  333 DE  100
38  333 DK  0
39  333 EE  0

对于每一行,我想找到 isr 的位置平均值,不包括该行的位置值。因此,对于第一行,这将是 isnr 332 的平均值,不包括“LV”或 ID 20。理想情况下,我正在寻找一个 dplyr 解决方案。谢谢!

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    您可以像这样以递归方式计算mean

    重组后,除一个数外,均值可以改写如下:

    Avg(N-1) = (Avg(N) * N - 第 N 个元素) / (N-1)

    library(dplyr)
    df %>%
      group_by(isnr) %>%
      mutate(my_mean=(mean(position) * n() - position) / (n()-1) ) 
    
    # A tibble: 20 x 5
    # Groups:   isnr [2]
          ID  isnr MS    position my_mean
       <int> <int> <chr>    <int>   <dbl>
     1    20   332 LV           0    44.4
     2    21   332 MT         100    33.3
     3    22   332 NL           0    44.4
     4    23   332 PL         100    33.3
     5    24   332 PT         100    33.3
     6    25   332 RO         100    33.3
     7    26   332 SE           0    44.4
     8    27   332 SI           0    44.4
     9    28   332 SK           0    44.4
    10    29   332 UK           0    44.4
    11    30   333 AT           0    42.2
    12    31   333 BE           0    42.2
    13    32   333 BU           0    42.2
    14    33   333 COM         80    33.3
    15    34   333 CR         100    31.1
    16    35   333 CY         100    31.1
    17    36   333 CZ           0    42.2
    18    37   333 DE         100    31.1
    19    38   333 DK           0    42.2
    20    39   333 EE           0    42.2
    

    【讨论】:

    • 也许将sum(position) 用于mean(position) * n()
    • @chinsoon12 是的,这是一个很好的简化 :) 我花了一分钟才弄清楚。但是当你这样看时:(sum(position)- position) / (n()-1) 是有道理的。
    猜你喜欢
    • 2012-09-11
    • 2019-04-03
    • 2018-07-12
    • 2014-10-08
    • 1970-01-01
    • 2016-08-01
    • 2021-02-08
    • 2021-12-22
    • 2020-08-10
    相关资源
    最近更新 更多