如何将R语言中DataFrame存储的图数据转换为指定格式的文本文件并生成图ID映射表
解决图数据转换与映射表生成问题
我来帮你搞定把图数据转换成指定文本格式,同时生成t与object映射表的需求,咱们从原始的node和edge DataFrame入手处理,步骤清晰又直观:
1. 生成t与object的映射表
首先咱们先创建映射表,把唯一的object按顺序分配从0开始的t值:
# 提取唯一的object并排序(保证顺序稳定) unique_objects <- unique(sort(node$object)) # 创建映射表 mapping_df <- data.frame( t = 0:(length(unique_objects)-1), object = unique_objects )
这样生成的mapping_df就完全符合你需要的格式啦,和你给出的示例结果一致。
2. 转换为目标文本格式
接下来咱们把每个图的数据转换成指定的文本格式,核心是把节点的id从1起始转换成0起始,然后按规则拼接每行内容:
# 初始化存储所有图文本的列表 graph_text_list <- list() # 遍历每个唯一的object for (i in seq_along(unique_objects)) { current_obj <- unique_objects[i] current_t <- i - 1 # t从0开始 # 提取当前图的节点和边数据 current_nodes <- node[node$object == current_obj, ] current_edges <- edge[edge$object == current_obj, ] # 节点id映射:原id(1-7)转成0-6 node_id_mapping <- setNames(0:(nrow(current_nodes)-1), current_nodes$id) # 生成节点行:v 新id func node_lines <- paste0("v ", node_id_mapping[current_nodes$id], " ", current_nodes$func) # 生成边行:e 新from 新to func edge_lines <- paste0("e ", node_id_mapping[current_edges$from], " ", node_id_mapping[current_edges$to], " ", current_edges$func) # 组合当前图的所有行,开头加上t标识 current_graph_text <- c( paste0("t # ", current_t), node_lines, edge_lines ) # 加入列表 graph_text_list[[i]] <- current_graph_text } # 把所有图的文本合并成一个向量 final_text <- unlist(graph_text_list)
3. 导出为txt文件
最后把生成的文本导出到txt文件:
# 写入文件,每行一个元素 writeLines(final_text, "graph_output.txt")
完整代码示例
把所有步骤整合在一起,包括你提供的准备数据代码:
# 准备数据 node <- data.frame(object=c("2-1887","2-1887","2-1887","2-1887","2-1887","2-1887","2-1887","4-1889","4-1889","4-1889","4-1889","4-1889","4-1889","4-1889"), id=c(1,2,3,4,5,6,7,1,2,3,4,5,6,7), func=c(6,18,18,3,19,18,11,6,18,19,18,18,18,20)) edge <- data.frame(object=c("2-1887","2-1887","2-1887","2-1887","2-1887","2-1887","2-1887","4-1889","4-1889","4-1889","4-1889","4-1889","4-1889","4-1889"), from=c(1,2,3,3,4,5,6,1,2,2,3,4,5,6), to=c(2,3,4,6,6,6,7,2,3,4,4,5,6,7), func=c(1,1,2,2,2,2,1,1,2,2,2,1,1,1)) # 生成映射表 unique_objects <- unique(sort(node$object)) mapping_df <- data.frame( t = 0:(length(unique_objects)-1), object = unique_objects ) # 转换为目标文本格式 graph_text_list <- list() for (i in seq_along(unique_objects)) { current_obj <- unique_objects[i] current_t <- i - 1 current_nodes <- node[node$object == current_obj, ] current_edges <- edge[edge$object == current_obj, ] node_id_mapping <- setNames(0:(nrow(current_nodes)-1), current_nodes$id) node_lines <- paste0("v ", node_id_mapping[current_nodes$id], " ", current_nodes$func) edge_lines <- paste0("e ", node_id_mapping[current_edges$from], " ", node_id_mapping[current_edges$to], " ", current_edges$func) current_graph_text <- c( paste0("t # ", current_t), node_lines, edge_lines ) graph_text_list[[i]] <- current_graph_text } final_text <- unlist(graph_text_list) # 导出txt文件 writeLines(final_text, "graph_output.txt")
运行这段代码后,你会得到:
mapping_df:符合要求的t与object映射DataFramegraph_output.txt:完全匹配你给出示例格式的文本文件
内容的提问来源于stack exchange,提问作者HSJ
相关产品推荐
相关产品推荐

