Все возможные комбинации, используемые для генерации относительного содержания указанных комбинаций из кадра данных - PullRequest
0 голосов
/ 11 мая 2018

Я пытаюсь создать цикл в R, который вычисляет все возможные комбинации всех 20 аминокислот без повторения в строках длиной до 20 символов:

S <- c('G','A','L','M','F','W','K','Q','E','S','P','V','I','C','Y','H','R','N','D','T')



allCombs <- function(x) c(x, lapply(seq_along(x)[-1L], 
                                    function(y) combn(x, y, paste0, collapse = "")),
                          recursive = TRUE)
fu <- allCombs(S) 

Этот код делает это, но у меня также есть dataframe / csv, который содержит относительные пропорции аминокислот для 1000 различных видов, например:

Species    G   A   L  ...
Species 1  0.1  0.2  0.4
Species 2  0.1  0.02 0.2
Species 3  0.0  0.09 0.01

То, что я пытаюсь сделать, - это вычислить, какова доля каждой другой комбинации аминокислот (G, A, L и т. Д.) В целом, т.е. 1, в виде вектора / списка / массива.

Причина, по которой я делаю это в R (а не в python), заключается в том, что я хочу в дальнейшем взаимодействовать с другими факторами (для которых R лучше подходит)

Извиняюсь за то, что неясно, мне трудно объяснить, пожалуйста, дайте мне знать, если я могу быть более ясным, спасибо!

1 Ответ

0 голосов
/ 11 мая 2018

Что, если бы вы сделали что-то подобное:

require(tidyverse)

Ваш скрипт, создающий все комбинации:

S <- c('G','A','L','M','F','W','K','Q','E','S','P','V','I','C','Y','H','R','N','D','T')

allCombs <- function(x) c(x, lapply(seq_along(x)[-1L], 
                                    function(y) combn(x, y, paste0, collapse = "")),
                          recursive = TRUE)
Scombi <- allCombs(S)

Создание примера данных:

set.seed(123)
RelativeTable <- data.frame(replicate(length(allCombs(LETTERS[1:5])), sample(0:1,4,rep=TRUE))) %>% 
  purrr::set_names(allCombs(LETTERS[1:5]))

RelativeTable

  A B C D E AB AC AD AE BC BD BE CD CE DE ABC ABD ABE ACD ACE ADE BCD BCE BDE CDE ABCD ABCE ABDE ACDE BCDE ABCDE
1 0 1 1 1 0  1  1  0  1  1  0  0  0  1  0   1   1   1   1   0   0   0   1   0   1    1    0    0    0    1     1
2 1 0 0 1 0  1  1  0  1  0  0  0  1  0  1   0   0   0   0   1   1   0   0   1   0    0    1    0    1    1     0
3 0 1 1 0 0  1  1  1  0  0  0  0  0  1  1   0   1   1   0   0   0   1   0   0   0    0    1    1    1    1     0
4 1 1 0 1 1  1  1  1  0  0  0  0  0  0  0   0   1   1   0   0   1   1   1   0   1    1    1    0    0    0     0

Выбор из RelativeTable только тех комбинаций, которые у нас также есть в Scombi

RelativeTable[, names(RelativeTable) %in%  Scombi]

Результат:

 A C D E AC AD AE CD ACD
1 0 1 1 0  1  0  1  0   1
2 1 0 1 0  1  0  1  1   0
3 0 1 0 0  1  1  0  0   0
4 1 0 1 1  1  1  0  0   0

Редактировать / объяснение.

То, что я здесь делаю RelativeTable[, names(RelativeTable) %in% Scombi] - это две вещи.

  1. Я использую %in%, который говорит мне, если значения в х в у. Функция возвращает логический вектор ИСТИНА / ЛОЖЬ, и мы можем использовать его, чтобы увидеть, какие комбинации аминокислот в RelativeTable находятся в комбинированном векторе. Кроме того, функция names() дает нам имена столбцов. Итак, names(RelativeTable) %in% Scombi (вы можете запустить только это утверждение), даст нам логический вектор и сообщит нам, есть ли у нас имена в относительной таблице, которые находятся в Scombi.
  2. Мы можем использовать логический вектор в качестве индексов. Это означает, что та же идея, что и RelativeTable[, 1], даст нам первый столбец, а RelativeTable[, c(1,3)] даст нам 1 и 3 столбца, RelativeTable [, names (RelativeTable)% в% Scombi] дает нам только столбцы «ИСТИНА» - что означает столбцы, которые мы хотим.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...