Извлекать корреляции подмножеств генов на основе кадра данных ключ -> значение

У меня есть два фрейма данных. Первый содержит матрицу корреляции ген-ген размером 1484 x 1484 (каждая ячейка соответствует значению корреляции между генами I и J). Второй содержит информацию типа ключ -> значение и выглядит следующим образом:

                       Complex            Protein_ID
1                      BCL6-HDAC4 complex       Bcl6
125                    BCL6-HDAC5 complex      Hdac5
249                    BCL6-HDAC7 complex       Bcl6
373 Multisubunit ACTR coactivator complex      Ep300
497                   Condensin I complex       Smc2
621                                BLOC-3       Hps4

Меня интересует извлечение корреляций генов, принадлежащих к одному и тому же комплексу, из моей матрицы и сохранение их в новом кадре данных, где для каждого комплекса я буду иметь значения корреляций между генами. В идеале это выглядело бы так:

#this is a simulated data.frame

                    Complex                                Correlation values
                    BCL6-HDAC4 complex                     0.64
                    BCL6-HDAC4 complex                     -0.25
                    Multisubunit ACTR coactivator complex  0.31
                    Multisubunit ACTR coactivator complex  0.30

Есть идеи, как мне туда добраться?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
58
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
library(data.table) # >= V1.15.0

df <-
  melt(data.table(cors),                    # matrix to long data.frame
       variable.name = "i",
       value.name = "cor"
  )[, let(i = as.integer(i), j = rowid(i))  # cols for i and j
  ][i < j                                   # keep distinct correlations
  ][, Complex := lkps$Complex[i]            # look up Complex for i
  ][Complex == lkps$Complex[j]]             # keep if Complex for j is same

Пример данных (10 генов, 3 группы, показаны только первые 6 столбцов корреляционной матрицы):

set.seed(1)
n_genes <- 10
cors <- cor(matrix(rnorm(n_genes * 50), nrow = 50, ncol = n_genes))
lkps <- data.frame(
  Complex = sample(c("Complex A", "Complex B", "Complex C"), n_genes, replace = TRUE),
  Protein_ID = replicate(n_genes, paste0(sample(c(letters, LETTERS), 4, replace = TRUE), collapse = "")))

> cors
             [,1]         [,2]         [,3]        [,4]         [,5]        [,6]
 [1,]  1.00000000 -0.039087178  0.026287227 -0.27185574  0.013674895 -0.11933102
 [2,] -0.03908718  1.000000000  0.003552006 -0.02391178  0.039833039  0.02218480
 [3,]  0.02628723  0.003552006  1.000000000  0.21648782  0.127791868  0.12197135
 [4,] -0.27185574 -0.023911775  0.216487818  1.00000000 -0.082713154 -0.24277681
 [5,]  0.01367489  0.039833039  0.127791868 -0.08271315  1.000000000  0.09888519
 [6,] -0.11933102  0.022184800  0.121971345 -0.24277681  0.098885194  1.00000000
 [7,]  0.19468192  0.006755358 -0.074116195  0.12591453  0.184806771 -0.14283941
 [8,] -0.14785348 -0.255064246 -0.054761988 -0.03252786  0.004459162  0.03851846
 [9,]  0.02336706  0.198299294  0.069506207  0.14657036  0.183043022 -0.10887799
[10,] -0.36678892  0.240101899  0.031648477  0.17387651  0.131315992 -0.12944992

> lkps
     Complex Protein_ID
1  Complex C       jMXs
2  Complex C       ruTw
3  Complex A       zoCU
4  Complex C       PCev
5  Complex A       aWvm
6  Complex B       vfRO
7  Complex A       GxvG
8  Complex B       jSsh
9  Complex B       lkpQ
10 Complex B       ufxz

Результат:

            cor     i     j   Complex
          <num> <int> <int>    <char>
 1: -0.03908718     1     2 Complex C
 2: -0.27185574     1     4 Complex C
 3: -0.02391178     2     4 Complex C
 4:  0.12779187     3     5 Complex A
 5: -0.07411620     3     7 Complex A
 6:  0.18480677     5     7 Complex A
 7:  0.03851846     6     8 Complex B
 8: -0.10887799     6     9 Complex B
 9: -0.12944992     6    10 Complex B
10: -0.05267148     8     9 Complex B
11:  0.04892611     8    10 Complex B
12:  0.18778267     9    10 Complex B

Другие вопросы по теме

Похожие вопросы