如何用R函数去除行列生成对称方阵?批量处理Excel表方案
批量生成对称网络矩阵及Excel工作表批量处理方案
一、单个非对称矩阵的清理方法
针对存在全NA列和多余行的非对称网络矩阵,可通过筛选有效列、匹配对应行数的方式生成对称矩阵。以下是具体实现代码:
清理函数实现
# 定义清理非对称矩阵的函数 clean_matrix <- function(df) { # 筛选出非全NA的Sender列(排除第一列Receiver) valid_sender_cols <- colSums(is.na(df[, -1])) != nrow(df) # 保留Receiver列和有效Sender列 temp_df <- df[, c(TRUE, valid_sender_cols)] # 提取与有效Sender列数量匹配的Receiver行,生成对称矩阵 clean_df <- temp_df[1:length(valid_sender_cols[valid_sender_cols]), ] return(clean_df) }
测试示例数据
# 示例原始非对称矩阵 df <- data.frame( Receiver = c("Receiver1", "Receiver2","Receiver3", "Receiver4", "Receiver5", "Receiver6","Receiver7", "Receiver8", "Receiver9", "Receiver10"), Sender1 = c(0,1,0,0,0,1,0,0,0,0), Sender2 = c(0,0,0,1,0,0,0,0,0,0), Sender3 = c(0,0,0,0,0,0,0,0,0,0), Sender4 = c(0,1,0,0,0,0,1,0,0,0), Sender5 = c(1,0,1,0,0,1,0,0,0,0), Sender6 = c(0,1,0,0,0,0,1,0,0,0), Sender7 = c(0,0,1,0,1,0,0,0,0,0), Sender8 = c(NA,NA,NA,NA,NA,NA,NA,NA,NA,NA), Sender9 = c(NA,NA,NA,NA,NA,NA,NA,NA,NA,NA), Sender10 = c(NA,NA,NA,NA,NA,NA,NA,NA,NA,NA) ) # 生成对称矩阵 df_clean <- clean_matrix(df) print(df_clean)
运行后将得到符合预期的对称矩阵df_clean。
二、批量处理Excel中的所有工作表
针对包含200个独立工作表的Excel文件,可通过循环实现批量读取、清理,并可导出清理后的结果。
批量处理代码
# 加载所需包(若未安装需先运行install.packages(c("readxl", "writexl"))) library(readxl) library(writexl) # 设置Excel文件路径,请替换为你的实际路径 excel_file <- "你的网络矩阵文件.xlsx" # 获取所有工作表名称 all_sheets <- excel_sheets(excel_file) # 创建空列表存储所有清理后的矩阵 cleaned_results <- list() # 循环处理每个工作表 for (sheet_name in all_sheets) { # 读取当前工作表数据 raw_data <- read_excel(excel_file, sheet = sheet_name) # 调用清理函数处理 cleaned_data <- clean_matrix(raw_data) # 将结果存入列表,以工作表名称为索引 cleaned_results[[sheet_name]] <- cleaned_data } # 可选:将清理后的所有矩阵导出到新Excel文件,每个工作表对应原名称 write_xlsx(cleaned_results, path = "清理后的对称网络矩阵.xlsx")
注意事项
- 确保Excel文件中每个工作表的结构与示例数据一致(第一列为Receiver,后续列为Sender开头的列)
- 若工作表结构有差异,可根据实际情况调整
clean_matrix函数的判断逻辑
内容的提问来源于stack exchange,提问作者Paige Kemp
相关产品推荐
相关产品推荐

