[英]How to calculate frequency of residue(nucleotide) coverage in each column in R?
我有一個包含如下數據集的fasta文件:
>sequence_1
ACCTGC--A
>sequence_2
ACC-GCTTA
>sequence_3
ACCTGCTTA
最終目標是產生表明核苷酸覆蓋百分比的結果。 因此,我會得到 100%、100%、100%、66.66%、100%、100%、66.66%、66.66$、100%。
我對 R 相當陌生,我現在的想法是將序列作為字符串讀取,然后轉換為列表,然后循環遍歷所有列表的第一個元素,所以沒有。
有沒有更簡單的方法來做到這一點?
這是strsplit
的簡單解決方案。
Biostrings
使讀取.fasta
文件變得輕而易舉。 請注意,這種方法要求序列已經對齊。
#BiocManager::install("Biostrings")
library(Biostrings)
data <- readDNAStringSet("data.fasta")
split <- strsplit(as.character(data),"")
logical.mat <- sapply(split, function(x) x != "-")
rowSums(logical.mat) / ncol(logical.mat)
#[1] 1.0000000 1.0000000 1.0000000 0.6666667 1.0000000 1.0000000 0.6666667 0.6666667 1.0000000
沒有使用生物包的經驗..所以這里有一個data.table
方法......
library( data.table )
DT <- data.table( text = c( "ACCTGC--A", "ACC-GCTTA", "ACCTGCTTA" ))
# text
# 1: ACCTGC--A
# 2: ACC-GCTTA
# 3: ACCTGCTTA
#split text to nucleoid
#get maximum number of nucleoid
n_max = length( tstrsplit(gsub("(.)", "\\1 ", DT$text), " ") )
#create a new column for each nucleoid
DT[, paste0( "nucl_", 1:n_max ) := tstrsplit(gsub("(.)", "\\1 ", text), " ") ]
# text nucl_1 nucl_2 nucl_3 nucl_4 nucl_5 nucl_6 nucl_7 nucl_8 nucl_9
# 1: ACCTGC--A A C C T G C - - A
# 2: ACC-GCTTA A C C - G C T T A
# 3: ACCTGCTTA A C C T G C T T A
#how to procees? possibly melt and summarise?
DT.melt <- melt(DT, id.vars = "text", measure.vars = patterns("^nucl") )
ans <- DT.melt[, .N, by = .(variable, value) ][, perc := N / sum(N), by = .(variable)][]
# variable value N perc
# 1: nucl_1 A 3 1.0000000
# 2: nucl_2 C 3 1.0000000
# 3: nucl_3 C 3 1.0000000
# 4: nucl_4 T 2 0.6666667
# 5: nucl_4 - 1 0.3333333
# 6: nucl_5 G 3 1.0000000
# 7: nucl_6 C 3 1.0000000
# 8: nucl_7 - 1 0.3333333
# 9: nucl_7 T 2 0.6666667
# 10: nucl_8 - 1 0.3333333
# 11: nucl_8 T 2 0.6666667
# 12: nucl_9 A 3 1.0000000
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.