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

时间:2014-05-14 16:58:48

标签: 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的<{1}}输出:

dput(df)

2 个答案:

答案 0 :(得分:7)

您可以查看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                  

答案 1 :(得分:2)

perl -lane'
  $s{$F[0]}++ or push @k, $F[0];
  $h{$F[1]}{$F[0]} = 1;
END {
  $, = "\t";
  print "", @k;
  for $c (@k) {
    print $c, map {
      $u = $_;      
      ($c eq $u) ? "-" : scalar grep $_->{$c} && $_->{$u}, values %h;
    } @k;
  }
}
' file

输出

        gene1   gene2   gene3
gene1   -       2       1
gene2   2       -       0
gene3   1       0       -