Измените формат совпадающих элементов в два столбца

Извините, если это повторяющийся вопрос, но я даже не совсем уверен, какие ключевые слова использовать для поиска этой проблемы.

У меня есть список генов и список типов клеток, в которых они находятся. Я хочу создать таблицу сетевого взаимодействия, чтобы показать взаимодействия между типами ячеек, в которых они выражены, предпочтительно с использованием Cytoscape, который я пытался проработать в течение последнего дня или около того, но сейчас я просто пытаюсь переформатировать свои данные, и для этого мне нужно разделить типы ячеек на два столбца.

Ниже приведен пример моих текущих данных для одного гена, который относится к 4 типам ячеек, но, очевидно, у меня есть несколько тысяч генов в полной таблице, каждый из которых может быть только в одном типе ячеек или нескольких (не всегда 4)

    GENENAME                  CellType
     CRYM                     Epithelial 
     CRYM                     Tubule  
     CRYM                     Cardiomyocyte
     CRYM                     Glandular 

Я хочу переформатировать приведенные выше данные, чтобы показать связи между типами ячеек, то есть переформатировать во что-то вроде этого:

    GENENAME                  CellType1         CellType2
     CRYM                     Epithelial        Tubule
     CRYM                     Epithelial        Cardiomyocyte
     CRYM                     Epithelial        Glandular
     CRYM                     Tubule            Cardiomyocyte
     CRYM                     Tubule            Glandular
     CRYM                     Cardiomyocyte     Glandular

В каком столбце окажется каждый из типов ячеек, не имеет значения для дальнейшего анализа, но было бы хорошо избегать обратных дубликатов. Однако я не могу понять, как переформатировать данные таким образом. Может ли кто-нибудь помочь?

Я считаю, что тогда я смогу загрузить данные в этом формате с двумя столбцами в Cytoscape, чтобы создать сетевой анализ и удалить ссылки с очень низким количеством генов.

Стоит ли изучать 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 называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
21
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Не самое элегантное решение, но я иду
По сути, первым шагом является фильтрация шага для каждого GENENAME, после чего я создаю цикл для сбора всех CellType2 и продолжаю их добавлять.

library(dplyr)
CellType <- c("Epithelial","Tubule","Cardiomyocyte","Glandular","Epithelial","Tubule","Cardiomyocyte","Glandular" )
GENENAME <- c("CRYM","CRYM","CRYM","CRYM","ABC","ABC","ABC","ABC")

df = data.frame(GENENAME=GENENAME,CellType=CellType)
df_full = c()
for (i in unique(df$GENENAME)){
  df_temp = filter(df,GENENAME==i)
  all_match = c()
  for (k in 1:nrow(df_temp)){
    anchor = df_temp[k,"CellType"] # This is the CellType1
    pair = df_temp[k:nrow(df_temp),"CellType"] # Find all the CellType2
    match = expand.grid(anchor,pair) #Create all combination
    all_match = rbind(all_match,match) #Append result
  }
  all_match = cbind(i,all_match) # Add the GENENAME information
  df_full = rbind(df_full,all_match)
}

result = filter(df_full,Var1!=Var2) #Remove case when CellType1 == CellType2
print(result)
      i          Var1          Var2
1  CRYM    Epithelial        Tubule
2  CRYM    Epithelial Cardiomyocyte
3  CRYM    Epithelial     Glandular
4  CRYM        Tubule Cardiomyocyte
5  CRYM        Tubule     Glandular
6  CRYM Cardiomyocyte     Glandular
7   ABC    Epithelial        Tubule
8   ABC    Epithelial Cardiomyocyte
9   ABC    Epithelial     Glandular
10  ABC        Tubule Cardiomyocyte
11  ABC        Tubule     Glandular
12  ABC Cardiomyocyte     Glandular

Да, это работает, хотя для запуска требуется некоторое время, учитывая, что это такой большой набор данных, спасибо.

Phil D 07.04.2021 18:09

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