r - weighted.mean 在 R 中跨 2 个向量的内部聚合?
问题描述
我有一个带有向量Latitude
、Longitude
、Period
和的数据框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
解决方案也会有所帮助。
任何帮助将不胜感激。最好的,
缺口
解决方案
如果您想根据组计算自己的权重,Period
并且ID
每个组ID
对中心点的影响相同,Period
那么我们只需将 1 除以每组中的观察数Perdiod
ID
。下面是使用weighted.mean
in的代码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)
推荐阅读
- c - 有没有办法在 VSCode 扩展中定义自定义任务?
- c++ - 当结构具有该成员时,访问模板函数中的结构成员
- angular - Angular Spectator 测试 ErrorHandler HttpErrorResponse
- c++ - 矢量调整大小行为复制和分配
- pandas - 切片熊猫数据框的列时保留索引
- angularjs - 如何将 mongoose bson 类型转换为 mongoose objectID
- python - 编码数据以进行插补,然后解码
- javascript - 删除 Vuetify 中的默认 v-input-file 图标
- angular - 为什么在使用单例类构建 Angular 包时出现错误?
- r - 可选参数与公式中的数据框冲突