2017-05-29 5 views
1

Ich habe folgendes tibble:
Wie zu zählen Überschneidungen zwischen den Mitgliedern dplyr :: group_by

library(tidyverse) 
df <- tibble::tribble(
    ~gene, ~celltype, 
    "a", "cel1_1", 
    "b", "cel1_1", 
    "c", "cel1_1", 
    "a", "cell_2", 
    "b", "cell_2", 
    "c", "cell_3", 
    "d", "cell_3" 
) 

df %>% group_by(celltype) 
#> Source: local data frame [7 x 2] 
#> Groups: celltype [3] 
#> 
#> # A tibble: 7 x 2 
#> gene celltype 
#> <chr> <chr> 
#> 1  a cel1_1 
#> 2  b cel1_1 
#> 3  c cel1_1 
#> 4  a cell_2 
#> 5  b cell_2 
#> 6  c cell_3 
#> 7  d cell_3 

die Gene in der Überlappung kann

cell1 a,b,c 
cell2 a,b 
cell3 c,d 

die folgende Art und Weise gruppiert werden Was Ich möchte die Genüberlappung für alle Zellen, , berechnen, die zu dieser Tabelle führen:

  cell1 cell2  cell3 
cell1 3   2   1 
cell2 2   2   0 
cell3 1   0   2 

Wie kann ich das erreichen?


aktualisieren

Und schließlich Prozentsatz (Division durch größten Nenner in Paaren) berechnen

  #cell1    cell2   cell3 
cell1 1.00(3/3)   0.67 (2/3)   0.33 (1/3) 
cell2 0.67 (2/3)   1.00    0 
cell3 0.33 (1/3)   0     1.00 

ich schon versucht, diese aber nicht bekommen, was ich will:

> tmp <- crossprod(table(df)) 
> tmp/max(tmp) 
     celltype 
celltype cel1_1 cell_2 cell_3 
    cel1_1 1.0000000 0.6666667 0.3333333 
    cell_2 0.6666667 0.6666667 0.0000000 
    cell_3 0.3333333 0.0000000 0.6666667 

Also die Diagonale wi Ich habe immer den Wert 1,00.

+2

Wenn ich verstehe, 'res <- tmp/max (tmp); diag (res) <- 1' – akrun

Antwort

4

Wir table verwenden mit crossprod

crossprod(table(df)) 
#  celltype 
#celltype cell_1 cell_2 cell_3 
# cell_1  3  2  1 
# cell_2  2  2  0 
# cell_3  1  0  2 

Oder eine andere Option ist tidyverse

library(tidyverse) 
count(df, gene, celltype) %>% 
     spread(celltype, n, fill = 0) %>% 
     select(-gene) %>% 
     as.matrix %>% 
     crossprod 
#  cel1_1 cell_2 cell_3 
#cel1_1  3  2  1 
#cell_2  2  2  0 
#cell_3  1  0  2 

Oder mit data.table

library(data.table) 
crossprod(as.matrix(dcast(setDT(df), gene~celltype, length)[,-1])) 
+0

nicht ganz. Ich suche nach Überlappung für zB Zelle1 (a, b, c) Zelle2 (c, d) die Überlappung ist (c) also der Wert in Zelle1, Zelle3 ist 1. – pdubois

+1

@pdubois Ich bekomme die erwartete Ausgabe mit dieser – akrun

+0

Sie ' hast recht. Es gibt einen Fehler in meinem OP. Ich habe es repariert. – pdubois

Verwandte Themen