r语言 - 用于从数据帧生成所述组合的相对丰度的所有可能组合



我正在尝试在 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) 

这段代码可以做到这一点,但我还有一个数据帧/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 更适合(。

很抱歉这有多不清楚,我发现很难解释,如果我能说得更清楚,请告诉我,谢谢!

如果你做这样的事情会怎样:

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%告诉我 x 中的值是否在 y 中。该函数返回一个 TRUE/FALSE 的逻辑向量,我们可以使用它来查看 RelativeTable 中出现的哪些氨基酸组合在组合向量中。 此外,该函数names()为我们提供了列的名称。 因此,names(RelativeTable) %in% Scombi(您可以只运行此语句(将为我们提供一个逻辑向量,并告诉我们在 Scombi 中的相对表中是否有名称。
  2. 我们可以使用逻辑向量作为索引。这意味着,与RelativeTable[, 1]相同的想法会给我们第一列,RelativeTable[, c(1,3)]会给我们 1 列和 3 列,RelativeTable[, names(RelativeTable( %in% Scombi] 只给我们"TRUE"列 - 这意味着我们想要的列。

最新更新