r - 匹配并计算 R 中的数据矩阵

标签 r perl count match

数据集如下所示:

 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 gene22 因为它们共享相同的样本 sample2sample3gene1 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/

相关文章:

Perl 通过 DOM 查找 Web 链接

mysql - 根据条件计数和排除

r - 使用 distrplus 拟合 truncnorm 分布会导致 fatal error (R 崩溃)

r - 打印列对齐的数据框(如 R 中所示)

r - 如何确定哪些列表元素包含 R 中的记录

r - 按组在设定函数中创建滞后

regex - Perl 正则表达式从时间戳中提取秒/毫秒

perl - 将字符串 "0x30"和十六进制数 0x30 传递给 hex() 函数之间的区别

mysql - 根据条件计算记录

java - 如何计算字符串中的对数