【问题标题】:How can I recalculate the mean of a mixture of individual and mean values with varying numbers of observations in R?如何重新计算 R 中具有不同观察次数的个体值和平均值的混合平均值?
【发布时间】:2021-02-26 02:13:13
【问题描述】:

我正在处理两组数据。第一个数据集是我从中进行测量的一组个体标本,另一个是以前研究中给定物种种群的一组报告的平均测量值。第一个数据集如下所示:

data.frame(Species = c('Species1', "Species1", 'Species1', 'Species2', 'Species3', 'Species3'),
           Specimen = c('A1', 'B2', 'C3', 'D4', 'E5', 'F6'),
           Measurement1 = c(100, 110, 120, 130, 140,150),
           Measurement2 = c(1, 2, 3, 4, 5, 6))

另一个看起来像这样:

data.frame(Species = c('Species1','Species1', 'Species2', 'Species3'),
                  N = c(10, 10, 11, 12),
                  Measurement1 = c(100, 100, 110, 120),
                  Measurement2 = c(1, 2, 3, 4))

我想做的是找到一种有效的方法来重新计算给定物种的平均值,给定该物种的所有观察结果。在上面给出的示例中,结果将如下所示:

data.frame(Species=c('Species1','Species2','Species3'),
                  N=c(23,12,14),
                  Measurement1=c(101.3043,111.67,123.5714),
                  Measurement2=c(1.565,3,4.214))

我知道aggregate() 将计算给定数据框的平均值,但我不知道有什么简单的方法可以重新计算几个求和平均值的平均值,或者如果条目数量不同,该怎么做.我知道可以使用公式手动重新计算平均值

(Xx*Nx)+(Xy*Ny)+(Xc*Nc) /(Nx+Ny+Nc)

但我不知道如何在 R 中以这样的方式编写它,以便可以使用由分组因子指定的不同数量的条目来完成。

【问题讨论】:

  • 您的数据似乎有问题。 (括号在错误的地方关闭。)。你能说明你是如何计算共享数据的吗?你如何在输出中得到101.3043Measurement1N 23 又是怎样的?
  • 我修正了编码。对于计算,我一直在 Excel 中手工完成,这就是为什么我想尝试寻找机器学习解决方案的原因。我得到 101.3043 因为有 23 个观察值(第一帧中的 3 个,第二组中的 20 个,每组 10 个),所以我得到 ((10*100)+(10*100)+(100+110+120) )/23.

标签: r machine-learning mean summary


【解决方案1】:

您可以将两个数据集组合起来,然后取加权平均值:

library(dplyr)

data1 %>%
  mutate(N = 1) %>%
  select(-Specimen) %>%
  bind_rows(data2) %>%
  group_by(Species) %>%
  summarise(across(starts_with('Measurement'), weighted.mean, N), 
            N = sum(N))

#  Species  Measurement1 Measurement2     N
#  <chr>           <dbl>        <dbl> <dbl>
#1 Species1         101.         1.57    23
#2 Species2         112.         3.08    12
#3 Species3         124.         4.21    14

【讨论】:

  • 如何为多个不以“Measurement”开头的列执行此操作? “Measurement1”只是我用于此问题的虚拟变量的名称。
  • 可以在across中指定列名:summarise(across(c(col1, col2), weighted.mean, N)
猜你喜欢
  • 1970-01-01
  • 2016-08-01
  • 2021-05-06
  • 2021-02-08
  • 1970-01-01
  • 2017-02-06
  • 1970-01-01
  • 1970-01-01
  • 2017-01-02
相关资源
最近更新 更多