如何在R语言中计算个体出行轨迹的回转半径(Radius of Gyration)
R环境下个体回转半径计算方案
目前没有专门适配「逐行存储到访记录、重复行代表多次到访」格式的开箱即用回转半径计算函数,按照给出的加权回转半径公式,仅需少量自定义代码即可完成计算,支持按个体ID批量处理,结果完全匹配定义要求。
计算逻辑匹配
完全对应回转半径的公式定义,实现步骤如下:
- 对单个个体,首先聚合得到所有唯一到访位置的到访频次
n_i,计算总到访次数N = Σn_i - 以到访频次为权重,计算所有到访位置的加权平均经纬度,即为轨迹质心r_cm
- 计算每个到访位置到质心的空间距离,按频次加权求距离平方的均值,开平方后即为该个体的回转半径
注:经纬度为球面坐标,跨城市/大尺度研究建议用球面距离计算,小范围(如单个城市)研究用平面欧氏距离即可,误差可忽略
可直接复用的代码
首先安装并加载需要的依赖包:
# 首次运行先安装依赖 # install.packages(c("dplyr", "geosphere")) library(dplyr) library(geosphere)
自定义计算函数,支持切换球面/平面距离计算:
#' 计算单个个体的回转半径 #' @param df 数据框,必须包含lat(纬度)、lon(经度)两列,每行为1次到访记录 #' @param use_spherical_dist 逻辑值,是否用球面Haversine距离计算,默认TRUE,返回结果单位为米;设为FALSE时用平面欧氏距离,返回单位为经纬度度 calc_radius_of_gyration <- function(df, use_spherical_dist = TRUE) { # 聚合统计每个唯一位置的到访次数 loc_stats <- df %>% count(lat, lon, name = "n_i") total_visits <- sum(loc_stats$n_i) # 计算加权质心坐标 cm_lat <- weighted.mean(loc_stats$lat, w = loc_stats$n_i) cm_lon <- weighted.mean(loc_stats$lon, w = loc_stats$n_i) # 计算各位置到质心的距离 if (use_spherical_dist) { # geosphere包要求坐标顺序为 经度,纬度 loc_matrix <- as.matrix(loc_stats[, c("lon", "lat")]) cm_matrix <- matrix(c(cm_lon, cm_lat), nrow = nrow(loc_stats), ncol = 2, byrow = TRUE) loc_stats$dist <- distHaversine(loc_matrix, cm_matrix) } else { loc_stats$dist <- sqrt((loc_stats$lat - cm_lat)^2 + (loc_stats$lon - cm_lon)^2) } # 代入公式计算回转半径 rog <- sqrt(sum(loc_stats$n_i * loc_stats$dist^2) / total_visits) return(rog) }
用提供的样例数据测试:
# 构造样例数据 sample_data <- data.frame( ID = c(100, 100, 100), lat = c(42.8142, 42.8142, 42.4843), lon = c(-70.8913, -70.8913, -71.2041) ) # 计算样例个体的回转半径 calc_radius_of_gyration(sample_data)
批量计算全数据集所有个体的结果
如果数据集包含多个研究个体,直接按ID分组调用函数即可得到所有个体的回转半径:
# 假设全量到访数据集命名为trip_df,包含ID、lat、lon三列 rog_result <- trip_df %>% group_by(ID) %>% group_modify(~data.frame( radius_of_gyration = calc_radius_of_gyration(.x) )) %>% ungroup()
内容的提问来源于stack exchange,提问作者ltong
相关产品推荐
相关产品推荐

