繁体   English   中英

如何编写 R 函数来反转互补 DNA?

[英]How can I write R function to reverse complementary DNA?

ReverseFunc <- function(base) {
  if(base == 'A' | base ==  'a') print("T") 
  else(base == 'T' | base == 't') print("A")
  else(base == 'G' | base == 'g') print("C")
  else(base == 'C' | base == 'c') print("G")
}

base <- 'ATCG' #This is your test data
comseq <- ReverseFunc(base)
print(comseq)

这是行不通的。 而且我必须通过不使用 R 包中的函数来编写函数。

有一个鲜为人知但功能强大的基础 R 函数可以做到这一点: chartr

chartr(old="ATGC", new="TACG", x )

base <- 'ATCG'
chartr("ATGC", "TACG", base )
#[1] "TAGC"

要转换小写项目,只需将它们添加为另一个“旧”序列,其大写序列与“新”值相同:

chartr("ATGCatgc", "TACGTACG", base )

如何使用它作为新函数的主体似乎很明显,它可能是家庭作业,所以我将其作为“读者练习”。 阻止您的版本工作的错误有两个方面。 1) 使用if和 2) 假设base字符串将按字符处理。 在 R 中, if函数不接受参数序列,因此即使您将输入字符值分解为其组成字母,它也只会处理第一个字母。 现在我看到了你家庭作业的最后一部分。 我不得不争论“不使用 R 包中的函数”的含义。 此处不适用,因为chartr位于基本安装中。 讲师不可能意味着不能使用基本安装功能,因为在这种情况下甚至会禁止function功能。

你的函数有几个问题:

  1. 您的函数假定参数 — base — 是单个基数(或基数向量),而不是由基数串联而成的字符串。 您首先需要拆分字符串,并且需要使用ifelse而不是if来执行矢量化比较。
  2. 对于替代分支,您需要else if而不仅仅是else
  3. 您的函数尝试通过print输出结果基数。 这是不合适的。 相反,您需要返回基地。
  4. 最后,这个函数试图计算一个补码,但它并没有反转它,尽管它的名字。 (这个名字也有问题:它应该是ReverseComp或它的一些变体,而Func在函数的名字中没有位置:它是多余的,没有信息量。)

放在一起,我们剩下这个:

reverse_complement <- function (dna) {
    bases = toupper(strsplit(dna, '')[[1L]])
    compl = ifelse(bases == 'A', 'T',
        ifelse(bases == 'C', 'G',
        ifelse(bases == 'G', 'C',
        ifelse(bases == 'T', 'A', 'N'))))

    paste(rev(compl), collapse = '')
}

… 然而,这个嵌套的ifelse调用相当复杂。 另一个答案中的chartr解决方案使这更具可读性,也更有效。 还有其他可能的解决方案(例如使用switch ),但它们也好不到哪里去。 chartr ,我会使用带有match的查找表。

添加一个单独的答案(再次不提供完整的答案,因为它是家庭作业)。 基于康拉德的match建议,可以将输入与输出翻译对齐:

c("T","A","C","G","T","A","C","G")[ match( strsplit(base, "")[[1]], 
c("A","T","G","C","a","t","g","c")) ]
#[1] "T" "A" "G" "C"

使用toupper会使它更加紧凑:

c("T","A","C","G")[ match( toupper(strsplit(base, "")[[1]]), 
c("A","T","G","C")) ]
[1] "T" "A" "G" "C"

这里要吸取的教训是 match 旨在重新运行数字索引,然后通常将其用作提取函数的参数[在用例中从结果向量中提取项目,例如

  possible_results_to_choose[ match( input, choices) ]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM