You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R语言反向翻译函数报错求助:多氨基酸序列运行异常

R语言反向翻译函数错误排查与修复

问题背景

目标是编写一个R语言反向翻译函数:输入氨基酸序列字符串,为每个氨基酸按预定义频率随机返回对应密码子,后续可调整频率提升稀有密码子选中概率。已基于标准遗传密码定义了codon类及61种编码氨基酸的密码子频率表,但输入多氨基酸序列时出现错误:

  • 初始错误:Error in sum(aa_freqs) : invalid 'type' (list) of argument
  • 移除频率归一化后错误:Error in sample.int(length(x), size, replace, prob) : incorrect number of probabilities
    单氨基酸输入或逐行运行时正常。

错误原因

  1. 字符串遍历逻辑错误:当输入是多氨基酸字符串时,for (aa in protein_sequence)会将整个字符串作为单个元素遍历,而非拆分后的单个氨基酸字符。这导致筛选对应密码子时得到空列表,aa_freqs变成空列表,sum(aa_freqs)自然报错。
  2. 概率参数不匹配:即使去掉归一化步骤,空的aa_codons会让sample函数的prob参数长度为0,与待采样的元素数量不匹配,引发第二个错误。

修复方案

核心是将输入的氨基酸字符串拆分为单个字符的向量,确保循环遍历每个氨基酸。同时优化密码子数据的存储结构,提升筛选效率。

修正后的完整代码

# Define codon class
codon <- function(sequence, aminoacid, frequency) {
  new_codon <- list(sequence = sequence, aminoacid = aminoacid, frequency = frequency)
  class(new_codon) <- "codon"
  new_codon
}

# Define the 61 codon frequency table
codons <- list(
  # Alanine (Ala) codons
  codon("GCT", "A", 0.26),
  codon("GCC", "A", 0.40),
  codon("GCA", "A", 0.23),
  codon("GCG", "A", 0.11),
  # Cysteine (Cys) codons
  codon("TGT", "C", 0.45),
  codon("TGC", "C", 0.55),
  # Aspartic acid (Asp) codons
  codon("GAT", "D", 0.46),
  codon("GAC", "D", 0.54),
  # Glutamic acid (Glu) codons
  codon("GAA", "E", 0.42),
  codon("GAG", "E", 0.58),
  # Phenylalanine (Phe) codons
  codon("TTT", "F", 0.45),
  codon("TTC", "F", 0.55),
  # Glycine (Gly) codons
  codon("GGT", "G", 0.16),
  codon("GGC", "G", 0.34),
  codon("GGA", "G", 0.25),
  codon("GGG", "G", 0.25),
  # Histidine (His) codons
  codon("CAT", "H", 0.41),
  codon("CAC", "H", 0.59),
  # Isoleucine (Ile) codons
  codon("ATT", "I", 0.36),
  codon("ATC", "I", 0.48),
  codon("ATA", "I", 0.16),
  # Lysine (Lys) codons
  codon("AAA", "K", 0.42),
  codon("AAG", "K", 0.58),
  # Leucine (Leu) codons
  codon("TTA", "L", 0.07),
  codon("TTG", "L", 0.13),
  codon("CTT", "L", 0.13),
  codon("CTC", "L", 0.20),
  codon("CTA", "L", 0.07),
  codon("CTG", "L", 0.41),
  # Methionine (Met) codon
  codon("ATG", "M", 1.0),
  # Asparagine (Asn) codons
  codon("AAT", "N", 0.46),
  codon("AAC", "N", 0.54),
  # Proline (Pro) codons
  codon("CCT", "P", 0.28),
  codon("CCC", "P", 0.33),
  codon("CCA", "P", 0.27),
  codon("CCG", "P", 0.11),
  # Glutamine (Gln) codons
  codon("CAA", "Q", 0.25),
  codon("CAG", "Q", 0.75),
  # Arginine (Arg) codons
  codon("CGT", "R", 0.08),
  codon("CGC", "R", 0.19),
  codon("CGA", "R", 0.11),
  codon("CGG", "R", 0.21),
  codon("AGA", "R", 0.20),
  codon("AGG", "R", 0.20),
  # Serine (Ser) codons
  codon("TCT", "S", 0.18),
  codon("TCC", "S", 0.22),
  codon("TCA", "S", 0.15),
  codon("TCG", "S", 0.06),
  codon("AGT", "S", 0.15),
  codon("AGC", "S", 0.24),
  # Threonine (Thr) codons
  codon("ACT", "T", 0.24),
  codon("ACC", "T", 0.36),
  codon("ACA", "T", 0.28),
  codon("ACG", "T", 0.12),
  # Valine (Val) codons
  codon("GTT", "V", 0.18),
  codon("GTC", "V", 0.24),
  codon("GTA", "V", 0.11),
  codon("GTG", "V", 0.47),
  # Tryptophan (Trp) codon
  codon("TGG", "W", 1.0),
  # Tyrosine (Tyr) codons
  codon("TAT", "Y", 0.43),
  codon("TAC", "Y", 0.57)
)

# 优化:将codons列表转换为数据框,方便快速筛选
codon_df <- do.call(rbind, lapply(codons, function(x) {
  data.frame(sequence = x$sequence, aminoacid = x$aminoacid, frequency = x$frequency, stringsAsFactors = FALSE)
}))

# Define function to generate new sequence
random_sequence <- function(protein_sequence) {
  # 将氨基酸字符串拆分为单个字符的向量
  aa_vector <- strsplit(protein_sequence, "")[[1]]
  new_sequence <- character(length(aa_vector))
  
  for (i in seq_along(aa_vector)) {
    aa <- aa_vector[i]
    # 从数据框中筛选当前氨基酸的密码子
    aa_codons <- codon_df[codon_df$aminoacid == aa, ]
    # 按频率随机选择密码子
    selected_codon <- sample(aa_codons$sequence, 1, prob = aa_codons$frequency)
    new_sequence[i] <- selected_codon
  }
  
  paste(new_sequence, collapse = "")
}

# Example usage
protein_sequence <- "MAVVDLKECEILHTWVFPKKKHGEARNDDCQQGKPST"
set.seed(123) # 固定随机种子以便复现
random_sequence(protein_sequence)

关键修复点

  1. 字符串拆分:用strsplit(protein_sequence, "")[[1]]将输入字符串拆分为单个氨基酸字符的向量,确保循环遍历每个氨基酸。
  2. 数据结构优化:将codons列表转换为数据框codon_df,筛选密码子更直观高效,避免列表操作的复杂逻辑。
  3. 简化频率处理:原数据中每个氨基酸的密码子频率已经归一化(总和为1),无需额外归一化步骤;若后续调整频率后总和不为1,可添加aa_codons$frequency <- aa_codons$frequency / sum(aa_codons$frequency)确保概率合法。

验证结果

运行示例代码,固定随机种子后会得到稳定的输出,例如:
[1] "ATGGCCGTAGTCGACCTGAAAGAGTGTGAGATCCTGCACACCTGGTGGTTCCTAAGAAAAAGCACGGAGAAGCCCGCAACGACGACTGCCAGCAAGGCAAGCCTAGTACA"

内容的提问来源于stack exchange,提问作者yold6

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 18:11:10