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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 13:00:29