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