如何计算R中每列中残基(核苷酸)覆盖率的频率?

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

没有使用 bio-packages 的经验..所以这里有一个 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