使用dplyr计算分组内每个成员到其他成员的最小距离
用dplyr计算分组内球员到最近同组球员的最小距离
需求说明
为数据集新增一列min_distance,表示每个ChanceId分组内,每个球员到同组其他9名球员的最小英尺距离。
解决方案
使用dplyr分组操作结合自定义函数实现,兼顾可读性与大规模分组的处理效率:
- 加载依赖包
library(dplyr)
- 定义计算最小距离的函数
函数在单个分组内生成所有球员的坐标距离矩阵,排除自身到自身的距离后,提取每行最小值(即当前球员到最近队友的距离):
calc_min_distance <- function(x, y) { # 生成欧氏距离矩阵 dist_matrix <- sqrt(outer(x, x, `-`)^2 + outer(y, y, `-`)^2) # 将对角线(自身距离)设为NA,避免干扰最小值计算 diag(dist_matrix) <- NA # 提取每行最小值 apply(dist_matrix, 1, min, na.rm = TRUE) }
- 分组计算并新增列
通过group_by按ChanceId分组,用mutate调用自定义函数生成结果:
data_with_min_dist <- data %>% group_by(ChanceId) %>% mutate(min_distance = calc_min_distance(X_RimLocation, Y_RimLocation)) %>% ungroup()
结果示例
查看处理后的数据集前6行:
head(data_with_min_dist)
输出结果:
# A tibble: 6 × 5 ChanceId Player X_RimLocation Y_RimLocation min_distance <chr> <chr> <dbl> <dbl> <dbl> 1 AD885857-5C31-575C-9963-B4D88E320451 Robert Covington -39.8 -7.97 4.60 2 AD885857-5C31-575C-9963-B4D88E320451 Mason Plumlee -40.6 4.19 2.89 3 AD885857-5C31-575C-9963-B4D88E320451 Jusuf Nurkic -40.1 1.51 2.89 4 AD885857-5C31-575C-9963-B4D88E320451 Ish Smith -30.0 18.0 12.2 5 AD885857-5C31-575C-9963-B4D88E320451 Gordon Hayward -34.2 -22.2 13.0 6 AD885857-5C31-575C-9963-B4D88E320451 Norman Powell -32.9 4.39 4.52
优势说明
- 基于
dplyr的分组逻辑,代码结构清晰,符合tidyverse风格 - 利用距离矩阵批量计算,比逐行循环效率更高,适合处理数千个分组的大规模数据
内容的提问来源于stack exchange,提问作者amerg
相关产品推荐
相关产品推荐

