У меня есть пример набора данных
имя_гена | motif_id | matched_sequence |
---|---|---|
А | у1 | ССС |
А | у2 | КЦААА |
А | у3 | ААГ |
А | у3 | В |
Б | у1 | АААА |
Б | у4 | ААТ |
С | у5 | ААГГ |
и пытаюсь получить набор данных, как в R:
имя_гена | Узел 1 | Узел2 | последовательность | появление |
---|---|---|---|---|
А | у1 | у2 | ССС, CCAAA | 2 |
А | у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)
однако не удалось получить столбцы последовательности и вхождения. Кто-нибудь может дать мне совет?
Мы группируем по «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))
@berliiiiin я думаю, что понимаю проблему. Вам нужно dplyr::filter(n() > 1, n_distinct(motif_id) > 1)
, потому что в примере не было случая, когда это происходит
Я получил ошибку в коде >>>> Вызвано ошибкой в
combn()
: ! n < m Backtrace: 1. ... %>% подавлять сообщения() 16. utils::combn(unique(motif_id), 2, упростить = FALSE) 17. base::stop("n < m", domain = NA )