数据集如下所示:
Gene SampleName
gene1 sample1
gene1 sample2
gene1 sample3
gene2 sample2
gene2 sample3
gene2 sample4
gene3 sample1
gene3 sample5
我的目标是制作这样的数据矩阵:
gene1 gene2 gene3
gene1 - 2 1
gene2 - - 0
gene3 - - -
gene1
vs gene2
是 2
因为它们共享相同的样本 sample2
和 sample3
。 gene1
vs gene3
是 1,因为它们只共享一个相同的样本 - sample1
。
我的问题是如何在 R 或 Perl 中实现这个目标?实际数据集要大得多。非常感谢您的帮助。
这是 R 的 dput(df)
输出:
df <- structure(list(Gene = c("gene1", "gene1", "gene1", "gene2", "gene2",
"gene2", "gene3", "gene3"), SampleName = c("sample1", "sample2",
"sample3", "sample2", "sample3", "sample4", "sample1", "sample5"
)), .Names = c("Gene", "SampleName"), row.names = c(NA, -8L), class = "data.frame")
最佳答案
您可以查看crossprod
(或tcrossprod
)函数以及table
:
out <- tcrossprod(table(df))
out
# Gene
# Gene gene1 gene2 gene3
# gene1 3 2 1
# gene2 2 3 0
# gene3 1 0 2
删除对角线和下三角形以获得您显示的确切输出。
diag(out) <- NA
out[lower.tri(out)] <- NA
print.table(out) ## print.table deals with NAs differently
# Gene
# Gene gene1 gene2 gene3
# gene1 2 1
# gene2 0
# gene3
关于r - 匹配并计算 R 中的数据矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23660789/