首页 > 解决方案 > weighted.mean 在 R 中跨 2 个向量的内部聚合?

问题描述

我有一个带有向量LatitudeLongitudePeriod和的数据框ID。我想计算每个周期(n = 2)的位置质心,按每个唯一 ID 的观察次数加权,以便观察次数较少的 ID 比观察次数多的 ID 获得更高的权重。

我的数据框是 300,000 obs,但看起来像这样:

dat <- data.frame(Latitude = c(35.8, 35.85, 36.7, 35.2, 36.1, 35.859, 36.0, 37.0, 35.1, 35.2),
                  Longitude = c(-89.4, -89.5, -89.4, -89.8, -90, -89.63, -89.7, -89, -88.9, -89),
                  Period = c(early, early, early, early, early, late, late, late, late, late),
                  ID = c(A, A, A, B, C, C, C, D, E, E))

我可以使用聚合轻松计算早期和晚期之间的平均值......centroid <- aggregate(cbind(Longitude, Latitude) ~ Period, dat, mean)但是有没有办法计算每个 ID 的观察次数加权的每个期间的质心,以便那些有更多观察的人不会偏向平均值?并且,如果可能的话,是否有一种优雅的方法可以在aggregate函数内部执行此操作,或者dplyr解决方案也会有所帮助。

任何帮助将不胜感激。最好的,

缺口

标签: rdplyraggregateweighted-average

解决方案


如果您想根据组计算自己的权重,Period并且ID每个组ID对中心点的影响相同,Period那么我们只需将 1 除以每组中的观察数Perdiod ID。下面是使用weighted.meanin的代码dplyr::across

library(dplyr)
dat %>% 
  group_by(Period, ID) %>% 
  mutate(weight = 1/n()) %>% 
  group_by(Period) %>% 
  summarise(across(c(Longitude, Latitude),
                   ~ weighted.mean(.x, w = weight)))

#> # A tibble: 2 x 3
#>   Period Longitude Latitude
#>   <chr>      <dbl>    <dbl>
#> 1 early      -89.7     35.8
#> 2 late       -89.2     36.0

# data
dat <- data.frame(Latitude = c(35.8, 35.85, 36.7, 35.2, 36.1, 35.859, 36.0, 37.0, 35.1, 35.2),
                  Longitude = c(-89.4, -89.5, -89.4, -89.8, -90, -89.63, -89.7, -89, -88.9, -89),
                  Period = rep(c("early", "late"), each = 5),
                  ID = c("A", "A", "A", "B", "C", "C", "C", "D", "E", "E"))

reprex 包于 2021-08-26 创建(v0.3.0)


推荐阅读