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

如何编写函数基于DataFrame列值从距离矩阵提取元素并添加新列?

给DataFrame添加距离列:从矩阵中匹配起点终点的对应值

嘿,这个需求在处理路径类数据的时候特别常见,用R来实现的话有几种简洁又高效的方式,我给你一步步拆解:

首先,先把你提到的示例数据构造出来,方便后续演示:

# 构造示例DataFrame
df <- data.frame(
  Origin = c("A", "B", "C"),
  Dest = c("B", "C", "B"),
  Time = c("Mon", "Wed", "Fri"),
  stringsAsFactors = FALSE
)

# 构造距离矩阵
dist_matrix <- matrix(
  c(0, 8, 11,
    8, 0, 6,
    11, 6, 0),
  nrow = 3,
  dimnames = list(c("A", "B", "C"), c("A", "B", "C"))
)

方法1:直接使用矩阵索引(最高效)

R的矩阵支持用行列名组成的矩阵来批量提取元素,我们可以用cbind()把Origin和Dest列组合成索引矩阵,直接拿到对应距离:

df$Distance <- dist_matrix[cbind(df$Origin, df$Dest)]

方法2:用dplyr管道(更直观,适合数据流水线处理)

如果你习惯用dplyr的语法,直接用mutate()添加列即可,R会自动按向量匹配每一行的起点和终点:

library(dplyr)

df <- df %>%
  mutate(Distance = dist_matrix[Origin, Dest])

验证结果

运行完上面任意一种方法后,你的df就会新增Distance列,结果如下:

Origin Dest Time Distance
1      A    B  Mon        8
2      B    C  Wed        6
3      C    B  Fri        6

额外提示:处理不匹配的情况

如果你的DataFrame里有不在距离矩阵行/列名里的起点/终点,会返回NA。可以提前做个检查:

# 检查所有起点终点都在矩阵名称中
all(df$Origin %in% rownames(dist_matrix)) && all(df$Dest %in% colnames(dist_matrix))

如果返回TRUE就没问题;如果返回FALSE,你可以选择过滤掉这些行,或者用replace()给NA设置默认值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:26:54