Match and Count the Data Matrix in R

count, match, perl, r

Solution

You can look at the `crossprod` (or `tcrossprod`) function along with `table`:

out <- tcrossprod(table(df))
out
#        Gene
# Gene    gene1 gene2 gene3
#   gene1     3     2     1
#   gene2     2     3     0
#   gene3     1     0     2

Drop the diagonal and the lower-triangle to get the exact output you show.

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                  

Problem

The dataset looks like this: ``` Gene SampleName gene1 sample1 gene1 sample2 gene1 sample3 gene2 sample2 gene2 sample3 gene2 sample4 gene3 sample1 gene3 sample5 ``` My goal is to make a data matrix like this: ``` gene1 gene2 gene3 gene1 - 2 1 gene2 - - 0 gene3 - - - ``` `gene1` vs `gene2` is `2` because they share the same samples `sample2` and `sample3`. `gene1` vs `gene3` is 1 because they only share one same sample - `sample1`. My question is how can I achieve this goal in R or Perl? The actual data set is much larger. I highly appreciate your help. Here's the `dput(df)` output for R: ``` 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") ```

Original source