我有以下几点:
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
重叠中的基因可以按以下方式分组
cell1 a,b,c
cell2 a,b
cell3 c,d
我想要做的是计算所有细胞的基因重叠, 得到这个表:
cell1 cell2 cell3
cell1 3 2 1
cell2 2 2 0
cell3 1 0 2
我怎样才能做到这一点?
更新
最后计算百分比(除以最大分母) 对)
#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
我尝试了这个,但没有得到我想要的东西:
> 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
所以对角线的值总是为1.00。
答案 0 :(得分:4)
我们可以将table
与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
或另一个选项是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
或data.table
library(data.table)
crossprod(as.matrix(dcast(setDT(df), gene~celltype, length)[,-1]))