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

在R中不使用as.dist函数将点间距离列表转为距离矩阵

在R中手动构建指定格式的距离矩阵(不使用as.dist函数)

我明白你想要把成对的点距离数据转换成特定格式的距离矩阵,而且不能用as.dist函数。下面是一步步的解决方案,完全符合你的需求:

步骤1:准备输入数据

首先把你提供的距离数据转换成R的数据框:

# 定义输入的点对距离数据
distance_df <- data.frame(
  A = c(3, 6, 3, 9, 4, 4, 6, 1, 2),
  B = c(10, 9, 5, 10, 8, 5, 7, 2, 10),
  Distance = c(0.2, 0.2, 0.4, 0.4, 0.5, 0.6, 0.7, 1.4, 2.6)
)

步骤2:创建初始全0矩阵

我们先确定所有的节点(这里是1到10),然后创建一个对应大小的全0矩阵,同时设置行名和列名为节点编号,方便后续定位:

# 获取所有节点并排序
all_nodes <- sort(unique(c(distance_df$A, distance_df$B)))
n_nodes <- length(all_nodes)

# 创建初始全0矩阵
dist_matrix <- matrix(0, nrow = n_nodes, ncol = n_nodes,
                      dimnames = list(all_nodes, all_nodes))

步骤3:填充矩阵的距离值

接下来遍历每一条距离记录,把值填充到矩阵对应的位置。这里我们确保只填充上三角区域(也就是节点编号小的在前,大的在后的位置),和你示例的格式匹配:

# 遍历每条距离数据,填充矩阵
for (i in 1:nrow(distance_df)) {
  node_a <- distance_df$A[i]
  node_b <- distance_df$B[i]
  dist_val <- distance_df$Distance[i]
  
  # 如果A的编号大于B,交换两者,确保我们填充的是i<j的位置
  if (node_a > node_b) {
    temp <- node_a
    node_a <- node_b
    node_b <- temp
  }
  
  # 给矩阵对应位置赋值
  dist_matrix[as.character(node_a), as.character(node_b)] <- dist_val
}

步骤4:按照你指定的格式输出矩阵

最后,我们按照你示例的格式(每行只保留从当前节点到最大节点的列)打印矩阵:

# 打印表头
cat(paste(all_nodes, collapse = " "), "\n")

# 逐行打印矩阵,每行只显示当前节点到末尾的列
for (row_idx in 1:n_nodes) {
  current_node <- all_nodes[row_idx]
  row_vals <- dist_matrix[row_idx, row_idx:n_nodes]
  line <- paste(c(current_node, row_vals), collapse = " ")
  cat(line, "\n")
}

运行这段代码后,你会得到和你示例几乎一致的输出(注:你示例中第二行的2后面缺少了2.6,这是原始数据里2到10的距离,代码会正确输出这个值)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 04:19:10