You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R语言用aggregate或dplyr按ID观测数加权计算分期经纬度质心

实现方案

核心逻辑

采用 1/ID对应观测数 作为单条记录的权重,同一ID的所有记录权重累加总和为1,保证所有ID对质心计算的贡献度一致,避免观测数多的ID拉偏均值结果。

首先给出修正后可直接运行的示例数据:

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"))

方案1:dplyr实现(推荐,可读性和性能更优,适配30万条数据无压力)

library(dplyr)

dat %>%
  # 统计每个ID在对应Period内的观测数,若要使用ID全局观测数计算权重,可去掉分组中的Period
  group_by(Period, ID) %>%
  mutate(id_obs_count = n()) %>%
  ungroup() %>%
  # 计算单条记录权重:观测数越少,权重越高
  mutate(weight = 1 / id_obs_count) %>%
  # 按Period分组计算加权质心
  group_by(Period) %>%
  summarise(
    weighted_longitude = weighted.mean(Longitude, weight),
    weighted_latitude = weighted.mean(Latitude, weight)
  )

方案2:aggregate实现

# 先计算每个ID的全局观测数和对应权重
id_count <- table(dat$ID)
dat$weight <- 1 / id_count[match(dat$ID, names(id_count))]

# aggregate内调用weighted.mean计算分组加权均值
result <- aggregate(cbind(Longitude, Latitude) ~ Period, dat, function(x) {
  weighted.mean(x, dat$weight[.I])
})

内容的提问来源于stack exchange,提问作者Nick

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 06:42:01