Как посчитать вхождение символа, а затем найти его процент
Поскольку мы знаем, что три набора кодонов кодируют аминокислоту, например, ATG кодирует только М (метионин) и ATC, ATA, ATT кодирует I (изолейцин) и процент ATG в последовательности ДНК всегда будет равен 1 для кодирования М и процентное содержание ATC в последовательности ДНК всегда будет 0,33 для кодирования I, такого как ATA и ATT. Я хочу создать функцию, которая могла бы рассчитывать количество кодонов в последовательности, а затем вычислять частоту образования определенных аминокислот.
codon <- list(ATA = "I", ATC = "I", ATT = "I", ATG = "M", ACA = "T",
ACC = "T", ACG = "T", ACT = "T", AAC = "N", AAT = "N", AAA = "K",
AAG = "K", AGC = "S", AGT = "S", AGA = "R", AGG = "R", CTA = "L",
CTC = "L", CTG = "L", CTT = "L", CCA = "P", CCC = "P", CCG = "P",
CCT = "P", CAC = "H", CAT = "H", CAA = "Q", CAG = "Q", CGA = "R",
CGC = "R", CGG = "R", CGT = "R", GTA = "V", GTC = "V", GTG = "V",
GTT = "V", GCA = "A", GCC = "A", GCG = "A", GCT = "A", GAC = "D",
GAT = "D", GAA = "E", GAG = "E", GGA = "G", GGC = "G", GGG = "G",
GGT = "G", TCA = "S", TCC = "S", TCG = "S", TCT = "S", TTC = "F",
TTT = "F", TTA = "L", TTG = "L", TAC = "Y", TAT = "Y", TAA = "stop",
TAG = "stop", TGC = "C", TGT = "C", TGA = "stop", TGG = "W")
( fracs <- 1/table(unlist(codon)) )
A C D E F G H I K L M
0.2500000 0.5000000 0.5000000 0.5000000 0.5000000 0.2500000 0.5000000 0.3333333 0.5000000 0.1666667 1.0000000
N P Q R S stop T V W Y
0.5000000 0.2500000 0.5000000 0.1666667 0.1666667 0.3333333 0.2500000 0.2500000 1.0000000 0.5000000
codonfracs <- setNames(lapply(codon, function(x) unname(fracs[x])), names(codon))
str(head(codonfracs))
List of 6
$ ATA: num 0.333
$ ATC: num 0.333
$ ATT: num 0.333
$ ATG: num 1
$ ACA: num 0.25
$ ACC: num 0.25
s <- 'AAGGCCTGCGCAAATATTTCCACTCCTTCCCGGGTGCTCCTGAGTTGAACCCGC
TTAGAGACTCCGAAATCAACGACGACTTCCACCAGTGGGCCCAGTGACCGCCACACTGGA
CCCCATACCACTTCTTTTTGTTATTCTTAAATATGTT
'
strsplit3 <- function(s, k=3) {
starts <- seq.int(1, nchar(s), by=k)
stops <- c(starts[-1] - 1, nchar(s))
mapply(substr, s, starts, stops, USE.NAMES=FALSE)
}
strsplit3(s)
[1] "AAG" "GCC" "TGC" "GCA" "AAT" "ATT" "TCC" "ACT" "CCT" "TCC" "CGG" "GTG" "CTC" "CTG" "AGT" "TGA"
[17] "ACC" "CGC" "\nTT" "AGA" "GAC" "TCC" "GAA" "ATC" "AAC" "GAC" "GAC" "TTC" "CAC" "CAG" "TGG" "GCC"
[33] "CAG" "TGA" "CCG" "CCA" "CAC" "TGG" "A\nC" "CCC" "ATA" "CCA" "CTT" "CTT" "TTT" "GTT" "ATT" "CTT"
[49] "AAA" "TAT" "GTT" "\n"
Я разделил свой аргумент на 3 кадра. Пожалуйста, помогите мне найти количество каждого кодона в аргументе и процент его появления. Выходные данные, для которых я ищу, представлены в виде таблицы, которая включает в себя четыре колоночных кодона, аминокислоты, для которых он кодирует, количество кодонов и процент встречаемости для образования этих аминокислот.
1 ответ
Обновленный ответ: пример в вашем комментарии был очень полезным. Код ниже, похоже, повторяет эти расчеты.
Поскольку ваш OP был в базе R, я сохранил свой ответ в базе R. Однако, если вы собираетесь продолжать использовать R для такого рода анализов, вам следует рассмотреть возможность использования пакета R tidyverse
для манипулирования данными и табулирования. Это синтаксис и ясность значительно лучше, чем базовый R.
#
# This should be created as a data.frame but we'll work with the data as given and
# first define Amino_Acid as a vector and then convert to data.frame
#
Amino_Acid <- c(ATA = "I", ATC = "I", ATT = "I", ATG = "M", ACA = "T",
ACC = "T", ACG = "T", ACT = "T", AAC = "N", AAT = "N", AAA = "K",
AAG = "K", AGC = "S", AGT = "S", AGA = "R", AGG = "R", CTA = "L",
CTC = "L", CTG = "L", CTT = "L", CCA = "P", CCC = "P", CCG = "P",
CCT = "P", CAC = "H", CAT = "H", CAA = "Q", CAG = "Q", CGA = "R",
CGC = "R", CGG = "R", CGT = "R", GTA = "V", GTC = "V", GTG = "V",
GTT = "V", GCA = "A", GCC = "A", GCG = "A", GCT = "A", GAC = "D",
GAT = "D", GAA = "E", GAG = "E", GGA = "G", GGC = "G", GGG = "G",
GGT = "G", TCA = "S", TCC = "S", TCG = "S", TCT = "S", TTC = "F",
TTT = "F", TTA = "L", TTG = "L", TAC = "Y", TAT = "Y", TAA = "stop",
TAG = "stop", TGC = "C", TGT = "C", TGA = "stop", TGG = "W")
amino_acid <- data.frame(Amino_Acid=Amino_Acid, Triplet=names(Amino_Acid), stringsAsFactors = FALSE)
#
# to avoid end-of-line chararacters in short lines or having a very long line,
# use paste to combine several one line strings into one long string
#
s <- paste0("AAGGCCTGCGCAAATATTTCCACTCCTTCCCGGGTGCTCCTGAGTTGAACCCGCTTAGAGACTCCG",
"AAATCAACGACGACTTCCACCAGTGGGCCCAGTGACCGCCACACTGGACCCCATACCACTTCTTTT",
"TGTTATTCTTAAATATGTT")
#
# function to split sequence into codons
#
strsplit3 <- function(string) {sapply(X=seq(1,nchar(string), 3),
FUN=function(starts=X, y=string) substr(y, starts, starts+2) ) }
#
# function to return counts in data.frame with given names
#
table_df <- function(data, column, count_name) {
tab <- table(data[, column], dnn = column)
as.data.frame.table(tab, responseName = count_name)
}
#
# identify triplets and amino acid in sequence
#
codon_seq <- data.frame(Triplet=strsplit3(s))
num_triplets <- nrow(codon_seq)
codon_seq <- merge(codon_seq, amino_acid, by = "Triplet")
#
# count triplets and amino acids
#
codon_seq <- merge(codon_seq, table_df(codon_seq, column = "Amino_Acid", count_name = "AA_cnt"))
codon_seq <- merge(codon_seq, table_df(codon_seq, column = "Triplet", count_name = "Number") )
#
# remove duplicate rows and calc frequencies and fractions
#
codon_seq <- unique(codon_seq)
codon_seq$Freq_1k <- round(1000*codon_seq$Number/num_triplets, 1)
codon_seq$Fraction <- round(codon_seq$Number/codon_seq$AA_cnt, 2)
#
# Arrange columns in same order as example
#
codon_seq <- with(codon_seq, data.frame(Triplet,Amino_Acid, Fraction, Freq_1k, Number))
Это даст результат
codon_seq
Triplet Amino_Acid Fraction Freq_1k Number
1 AAA K 0.50 19.6 1
2 AAG K 0.50 19.6 1
3 AAT N 1.00 19.6 1
4 ACC T 0.30 58.8 3
5 ACG T 0.20 39.2 2
6 ACT T 0.50 98.0 5
7 AGT S 0.33 58.8 3
8 ATA I 0.50 19.6 1
9 ATT I 0.50 19.6 1
10 CAC H 0.50 19.6 1
11 CAT H 0.50 19.6 1
…