gpt4 book ai didi

r - 如何计算 dplyr::group_by 成员之间的重叠

转载 作者:行者123 更新时间:2023-12-02 03:55:04 25 4
gpt4 key购买 nike

我有以下小题:

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。

最佳答案

我们可以将tablecrossprod一起使用

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]))

关于r - 如何计算 dplyr::group_by 成员之间的重叠,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44234697/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com