如何在R语言中将存在/缺失数据转换为共现矩阵?
解决存在/缺失数据的共现矩阵生成问题
方法一:矩阵乘法(高效简洁)
这是最直接的实现方式,利用0/1矩阵的转置乘法快速计算共现次数:
首先补全你的数据构造代码(原代码缺少species定义):
species <- c("A", "B", "C") x <- c(1, 1, 1) y <- c(0, 1, 0) z <- c(1, 1, 0) df_pa_species <- data.frame(species, x, y, z)
然后执行以下代码生成共现矩阵:
# 提取细胞类型的数值矩阵(排除物种列) pa_matrix <- as.matrix(df_pa_species[, -1]) # 计算共现次数:转置矩阵 × 原矩阵,得到的元素[i,j]即细胞类型i和j的共现次数 co_occur <- t(pa_matrix) %*% pa_matrix # 将对角线(自身与自身的共现)替换为"-" diag(co_occur) <- "-" # 查看结果 co_occur
运行后输出结果:
x y z x - 1 2 y 1 - 1 z 2 1 -
方法二:基于拆分后的细胞类型对统计(直观易懂)
如果你想基于你转换后的db4数据框实现,可以通过拆分细胞类型对、统计频数来构造矩阵:
# 构造你提到的db4数据框 db4 <- data.frame(df_pa_species[1], cols = apply(df_pa_species[-1], 1, function(x) paste(names(x)[x==1], collapse=",")), stringsAsFactors = FALSE) # 拆分每个物种的细胞类型为列表 cell_list <- strsplit(db4$cols, ",") # 生成每个物种内的所有无序细胞类型对 pairs_list <- lapply(cell_list, function(x) { if(length(x) >= 2) t(combn(x, 2)) else NULL }) # 合并所有类型对并统计出现次数 all_pairs <- do.call(rbind, pairs_list) pair_counts <- table(paste(all_pairs[,1], all_pairs[,2], sep="-")) # 初始化共现矩阵 cell_types <- colnames(df_pa_species[-1]) co_occur_matrix <- matrix("-", nrow=length(cell_types), ncol=length(cell_types), dimnames=list(cell_types, cell_types)) # 填充矩阵的共现次数 for(pair in names(pair_counts)) { c1 <- strsplit(pair, "-")[[1]][1] c2 <- strsplit(pair, "-")[[1]][2] co_occur_matrix[c1, c2] <- as.character(pair_counts[pair]) co_occur_matrix[c2, c1] <- as.character(pair_counts[pair]) } # 查看结果 co_occur_matrix
该方法同样能得到你需要的共现矩阵,适合理解共现对的生成逻辑。
内容的提问来源于stack exchange,提问作者Rosalin August
相关产品推荐
相关产品推荐

