Извлечение соответствующей переменной в summ()

У меня есть пример набора данных

имя_генаmotif_idmatched_sequence
Ау1ССС
Ау2КЦААА
Ау3ААГ
Ау3В
Бу1АААА
Бу4ААТ
Су5ААГГ

и пытаюсь получить набор данных, как в R:

имя_генаУзел 1Узел2последовательностьпоявление
Ау1у2ССС, CCAAA2
Ау1у3КХЦ, ААГ, ААТ3
Ау2у3КЦААА, АГГ, ААТ3
Бу1у4АААА, ААТ2

Столбец motif_id всегда имеет цель и ищет общий имя_гена из каждой комбинации начального столбца без каких-либо перекрытий и его списка последовательности.

Я пытался :

data%>% 
  group_by(gene_name, motif_id) %>% 
  summarize(matched_sequence = paste0(matched_sequence, collapse = ",")) %>% 
  mutate(count = n()) %>% filter(count>=2) %>%
  summarize(motif_id = combn(motif_id, 2, function(x) list(setNames(x, c('Node1', 'Node2')))), matched_sequence = toString(matched_sequence),
            .groups = 'keep') %>%
  tidyr::unnest_wider(motif_id) 

однако не удалось получить столбцы последовательности и вхождения. Кто-нибудь может дать мне совет?

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать 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
51
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Мы группируем по «gene_name», оставляем только группы, в которых количество различных (n_distinct элементов в «motif_id» больше 1. получаем попарные combn-ации «уникальных» элементов, создаем «последовательность», извлекая «matched_sequence» который соответствует значениям «motif_id», получить lengths из list в «вхождении», использовать unnest_wider для создания столбцов из столбца list и преобразовать «последовательность» list в столбец character, paste объединяя элементы в list

library(dplyr)
library(purrr)
library(tidyr)
library(stringr)
data %>%
   dplyr::group_by(gene_name) %>%  
   dplyr::filter(n() > 1, n_distinct(motif_id) > 1) %>% 
   dplyr::summarise(Node =  combn(unique(motif_id), 2, 
       simplify = FALSE),
    sequence = purrr::map(Node, ~ 
        matched_sequence[motif_id  %in% .x]),
     occurence = lengths(sequence), .groups = 'drop') %>%
   tidyr::unnest_wider(Node) %>%
   dplyr::mutate(sequence = purrr::map_chr(sequence, toString)) %>%
   dplyr::rename_with(~ stringr::str_c("Node", seq_along(.x)), starts_with("..."))

-выход

# A tibble: 4 × 5
  gene_name Node1 Node2 sequence       occurence
  <chr>     <chr> <chr> <chr>              <int>
1 A         y1    y2    CCC, CCAAA             2
2 A         y1    y3    CCC, AAG, AT           3
3 A         y2    y3    CCAAA, AAG, AT         3
4 B         y1    y4    AAAA, AAT              2

данные

data <- structure(list(gene_name = c("A", "A", "A", "A", "B", "B", "C"
), motif_id = c("y1", "y2", "y3", "y3", "y1", "y4", "y5"), 
matched_sequence = c("CCC", 
"CCAAA", "AAG", "AT", "AAAA", "AAT", "AAGG")), 
class = "data.frame", row.names = c(NA, 
-7L))

Я получил ошибку в коде >>>> Вызвано ошибкой в ​​combn(): ! n < m Backtrace: 1. ... %>% подавлять сообщения() 16. utils::combn(unique(motif_id), 2, упростить = FALSE) 17. base::stop("n < m", domain = NA )

berliiiin 20.03.2022 19:43

@berliiiiin я думаю, что понимаю проблему. Вам нужно dplyr::filter(n() > 1, n_distinct(motif_id) > 1), потому что в примере не было случая, когда это происходит

akrun 20.03.2022 19:53

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