gpt4 book ai didi

r - 如何在 r 中创建和弦图?

转载 作者:行者123 更新时间:2023-12-05 03:18:47 26 4
gpt4 key购买 nike

我以前从未做过这样的情节,很抱歉,因为这可能是一个基本问题,但我一直在研究如何制作和弦图,特别是如何将外部部分作为我的列标题(药物机制)并且各部分之间的内部连接是不需要在图中命名的行(基因),因为有这么多。

我的数据是用 0 或 1 标记为与药物机制列相互作用的基因行。

例如,我的数据子集如下所示:

Gene    Diuretic  Beta_blocker  ACE_inhibitor
Gene1 1 0 0
Gene2 0 0 1
Gene3 1 1 1
Gene4 0 1 1

我的总数据实际上是 15 列药物机制的 700 个基因,其中包含所有 zeors 和 ones。我目前正在创建一个和弦图:

df <- fread('df.csv')
df[is.na(df)] <- 0

df <- df %>% data.frame %>% set_rownames(.$Gene) %>% dplyr::select(-Gene)
mt <- as.matrix(df)

circos.par(gap.degree = 0.9) #set this as I was otherwise getting an error with my total data
chordDiagram(mt, transparency = 0.5)

根据我的总数据,该图如下所示: enter image description here

我一直在试图让这个图只有 15 个部分(甚至只是试图让这些部分具有列名)时遇到各种错误。

有没有办法让我绘制一个和弦图,其中的部分代表每一列?那么对于该部分和弦图中显示的任何其他部分具有交互作用(数据中的 1)的基因/行?我不需要基因名称可见,我只想可视化我的列/部分之间的重叠量。

示例输入数据(我的问题是尝试让每列只有 3 个部分来显示它们的重叠):

df <- structure(list(Gene = c("Gene1", "Gene2", "Gene3", "Gene4"), 
Diuretic = c(1L, 0L, 1L, 0L), Beta_blocker = c(0L, 0L, 1L,
1L), ACE_inhibitor = c(0L, 1L, 1L, 1L)), row.names = c(NA,
-4L), class = c("data.table", "data.frame")

最佳答案

如果您有 15 种不同的药物机制,最好计算各种机制共有的基因,并使用这些作为药物作用之间联系的权重。

您的示例数据太有限,无法给人一种感觉,但代码应该是这样的:

new_df <-apply(df, 1, function(x) {
x <- names(df)[which(x == 1)]
m <- 1 - diag(length(x))
dimnames(m) <- list(x, x)
inds <- which(lower.tri(m), arr.ind = TRUE)
data.frame(from = x[inds[,1]], to = x[inds[,2]])}) %>%
bind_rows() %>%
mutate(wt = 1) %>%
group_by(from, to) %>%
summarize(wt = sum(wt), .groups = 'drop')

new_df
#> # A tibble: 3 x 3
#> from to wt
#> <chr> <chr> <dbl>
#> 1 ACE_inhibitor Beta_blocker 2
#> 2 ACE_inhibitor Diuretic 1
#> 3 Beta_blocker Diuretic 1

我们可以看到,我们有两个基因对 ACE 抑制剂和 β 受体阻滞剂机制具有共同作用(这就是您的表格所暗示的),以及一个将利尿剂与 β 受体阻滞剂和 ACE 抑制剂与利尿剂联系起来的基因。

这会产生以下相当沉闷的和弦图:

chordDiagram(new_df)

enter image description here

但是,如果我们制作一个与您的真实数据规模相同的样本数据集,我们会得到更令人满意的结果:

set.seed(123)

big_dat <- as.data.frame(matrix(rbinom(15 * 700, 1, 0.5), 700),
row.names = paste0('Gene', 1:700)) %>%
setNames(c('ACE_inhibitor', 'Diuretic', 'Beta_Blocker',
'CCB', 'Nitrate', 'K_channel', 'Aldosterone_blocker',
'Vasodilator', 'PDEI', 'Central', 'Relaxant',
'ARB', 'Alpha_blocker', 'Dopaminergic', 'Unknown'))

big_df <- apply(big_dat, 1, function(x) {
x <- names(big_dat)[which(x == 1)]
m <- 1 - diag(length(x))
dimnames(m) <- list(x, x)
inds <- which(lower.tri(m), arr.ind = TRUE)
data.frame(from = x[inds[,1]], to = x[inds[,2]])}) %>%
bind_rows() %>%
mutate(wt = 1) %>%
subset(complete.cases(.)) %>%
group_by(from, to) %>%
summarize(wt = sum(wt), .groups = 'drop')

chordDiagram(big_df)

enter image description here

关于r - 如何在 r 中创建和弦图?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73609132/

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