我正在尝试在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来索引以响应一串字母。我有一种感觉,解决方案可能非常简单,但到目前为止,我还没有找到适合这项任务的功能。
答案 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