数据集如下所示:
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的<{1}}输出:
dput(df)
答案 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 -