如何计算dplyr::group_的成员之间的重叠

如何计算dplyr::group_的成员之间的重叠,r,dplyr,R,Dplyr,我有以下几点: 库(tidyverse) df%分组依据(单元类型) #>来源:本地数据帧[7 x 2] #>分组:celltype[3] #> #>#A tibble:7 x 2 #>基因细胞型 #> #>1 a cel1\u 1 #>2 b cel1_1 #>3 c cel1_1 #>4 a单元2 #>5b单元2 #>6c单元3 #>7d单元3 重叠中的基因可以按以下方式分组 1单元a、b、c 第2单元a、b 第三单元c,d 我要做的是计算所有细胞的基因重叠, 结果如下

我有以下几点:

库(tidyverse)
df%分组依据(单元类型)
#>来源:本地数据帧[7 x 2]
#>分组:celltype[3]
#> 
#>#A tibble:7 x 2
#>基因细胞型
#>       
#>1 a cel1\u 1
#>2 b cel1_1
#>3 c cel1_1
#>4 a单元2
#>5b单元2
#>6c单元3
#>7d单元3
重叠中的基因可以按以下方式分组

1单元a、b、c
第2单元a、b
第三单元c,d
我要做的是计算所有细胞的基因重叠, 结果如下表所示:

cell1 cell2 cell3
单元1 3 2 1
20号牢房
单元格3 1 0 2
我怎样才能做到这一点


更新

最后计算百分比(除以最大分母) 配对)

#单元1单元2单元3
单元格1.00(3/3)0.67(2/3)0.33(1/3)
单元格2 0.67(2/3)1.00 0
单元格30.33(1/3)01.00
我试过了,但没有得到我想要的:

>tmp tmp/max(tmp)
细胞型
celltype cel1\u 1 Cellu 2 Cellu 3
cel1_1 1.0000000 0.66667 0.3333333
单元格2 0.66667 0.66667 0.0000000
单元格3 0.3333333 0.0000000.66667

因此对角线的值始终为1.00。

我们可以将
表格
交叉生产

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

或使用
数据。表格

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

我们可以将
表格
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

或使用
数据。表格

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

@pdubois我使用this@pdubois你的数据集有多大?我更新了一个tidyverse选项和data.table选项。我忘了将dplyr管道序列分配给变量
df
@pdubois:只需将其分配给tmp,然后
tmp@pdubois。Akrun也添加了答案,不是在答案中,而是在对你的问题的评论中。这就像捉迷藏;我们有什么反对线性…@pdubois我得到了预期的输出this@pdubois你的数据集有多大?我更新了一个tidyverse选项和data.table选项。我忘了将dplyr管道序列分配给变量
df
@pdubois:只需将其分配给tmp,然后
tmp@pdubois。Akrun也添加了答案,不是在答案中,而是在对你的问题的评论中。这就像捉迷藏;如果我理解,
res如果我理解,
res,我们有什么反对线性的呢