[英]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
功能。
你的函数有几个问题:
base
— 是单个基数(或基数向量),而不是由基数串联而成的字符串。 您首先需要拆分字符串,并且需要使用ifelse
而不是if
来执行矢量化比较。else if
而不仅仅是else
。print
输出结果基数。 这是不合适的。 相反,您需要返回基地。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.