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 包中的函式來撰寫函式。
uj5u.com熱心網友回復:
有一個鮮為人知但功能強大的基礎 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 在這種情況下,功能將被禁止。
uj5u.com熱心網友回復:
你的函式有幾個問題:
- 您的函式假定引數 —
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.
uj5u.com熱心網友回復:
添加一個單獨的答案(再次不提供完整的答案,因為它是家庭作業)。基于 Konrad 的建議,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) ]
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/358133.html
標籤:r
上一篇:如何更改R中列的語法?
下一篇:R-合并多列中的缺失資料
