在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
相关产品推荐
相关产品推荐

