为每个字母分配数字,以便r计算单词

时间:2016-04-11 21:03:37

标签: r

我正在尝试在R中创建一个工具,它将计算以单字母氨基酸代码输入的肽链的原子组成(即碳,氢,氮和氧原子的数量)。例如,肽KGHLY由氨基酸赖氨酸(K),甘氨酸(G),组氨酸(H),亮氨酸(L)和酪氨酸(Y)组成。赖氨酸由6碳,13氢,1氮和2氧组成。甘氨酸由2个碳,5个氢,1个氮和2个氧组成。等等 我希望r代码从数据框读取肽串(KGHLY)或使用readline()从键盘输入 我是R的新手,也是编程新手。我能够为每种氨基酸制造物体,例如G < - c(2,5,1,2)或构建包含所有20个氨基酸及其各自原子组成的数据框。 我正在努力的一点是,我不知道如何从数据帧中获取R来索引以响应一串字母。我有一种感觉,解决方案可能非常简单,但到目前为止,我还没有找到适合这项任务的功能。

1 个答案:

答案 0 :(得分:2)

这里有两个主要的组成部分:选择 一种存储基本数据的方法和算法 计算你想要的结果。

对于计算,最好有你的数据 存储在矩阵中,由于R回收短矢量的方式 当乘以两个向量时。如果你这回收也会开始 想要将矩阵与向量相乘,因为矩阵是a 带有一些附加属性的向量(也就是说,维度 和维度名称)。考虑下面的例子来看看它是怎么回事 作品

test_matrix <- matrix(data = 1:12, nrow = 3)
test_vec <- c(3, 0, 1)

test_matrix
     [,1] [,2] [,3] [,4]
[1,]    1    4    7   10
[2,]    2    5    8   11
[3,]    3    6    9   12

test_matrix * test_vec
     [,1] [,2] [,3] [,4]
[1,]    3   12   21   30
[2,]    0    0    0    0
[3,]    3    6    9   12

根据这一观察结果,可以推断出一种解决方案 其中每个氨基酸在基质中有一行可能是一个好方法 存储查找数据;当我们有一个计数向量时 它指定了每行所需的贡献量 将足以将我们的矩阵乘以计数 向量,然后对列进行求和 - 使用的最后一部分求解 colSums

colSums(test_matrix * test_vec)
[1]  6 18 30 42

一般来说,疼痛&#34;将这种信息存储在一个 矩阵,因为它可能是一个很多的工作&#34;更新 以后的信息。但是,我猜它并不常见 需要添加新的氨基酸,这可能不是一个问题 这个案例。

因此,让我们为所需的五种氨基酸创建一个矩阵 对于您在示例中提到的肽。数字是 在维基百科上找到,希望我复制时不会搞砸 他们。只需按照惯例添加所有其他氨基酸。

amino_acids <- rbind(
    G = c(C = 2, H = 5,  N = 1, O = 2),
    L = c(C = 6, H = 13, N = 1, O = 2),
    H = c(C = 6, H = 9,  N = 3, O = 2),
    K = c(C = 6, H = 14, N = 2, O = 2),
    Y = c(C = 9, H = 11, N = 1, O = 3))

amino_acids
  C  H N O
G 2  5 1 2
L 6 13 1 2
H 6  9 3 2
K 6 14 2 2
Y 9 11 1 3

此矩阵包含我们想要的信息,但可能是 最好是按字典顺序排列它们 - 它会是 很高兴确保我们没有错误地添加相同的行 两次。下面的代码解决了这两个问题。

amino_acids <-
    amino_acids[sort(unique(rownames(amino_acids))), ]

amino_acids                   
  C  H N O
G 2  5 1 2
H 6  9 3 2
K 6 14 2 2
L 6 13 1 2
Y 9 11 1 3

下一部分是弄清楚如何处理多肽。这个 这将通过首先使用strsplit分割字符串来完成 分成单独的字符,然后使用table - 解决方案 结果得到我们想要与矩阵相乘的向量。

peptide <- "KGHLY"

peptide_2 <- unlist(strsplit(x = peptide, split = ""))
peptide_2
[1] "K" "G" "H" "L" "Y"

table上使用peptide_2给我们

table(peptide_2)
peptide_2
G H K L Y 
1 1 1 1 1 

因此,这可以用于定义向量以在第一个示例中扮演test_vec的角色。但是,通常,生成的向量将包含比矩阵amino_acids的行更少的组件;因此必须首先执行限制,以便获得我们计算所需的正确格式。

有几个选项可供使用,最简单的选项可能是使用表中的名称来对amino_acids中所需的行进行子集化,这样计算就可以继续进行而无需进一步模糊。

peptide_vec <- table(peptide_2)

colSums(amino_acids[names(peptide_vec), ] * as.vector(peptide_vec))
 C  H  N  O 
29 52  8 11

这概述了一个可能解决问题核心的解决方案, 这可以收集到一个照顾所有人的功能 我们的步骤。

peptide_function <- function(peptide, amino_acids) {
    peptide_vec <- table(
        unlist(strsplit(x = peptide, split = "")))
    ## Compute the result and return it to the work flow.
    colSums(
        amino_acids[names(peptide_vec), ] *
        as.vector(peptide_vec))
}

最后进行一项测试,看看我们得到了和以前一样的答案。

peptide_function(peptide = "GHKLY",
                 amino_acids = amino_acids)
 C  H  N  O 
29 52  8 11

下一步是什么?那取决于你如何存储你的 多肽,以及你想对结果做些什么。如果是的话 例如,您将多肽存储在载体中,并希望如此 为了将结果存储在矩阵中,那么它可以例如是 可以使用下面给出的vapply

data_vector <- c("GHKLY", "GGLY", "HKLGL")

result <- t(vapply(
    X = data_vector,
    FUN = peptide_function,
    FUN.VALUE = numeric(4),
    amino_acids = amino_acids))

result
       C  H N  O
GHKLY 29 52 8 11
GGLY  19 34 4  9
HKLGL 26 54 8 10