我有一个包含数百行的数据框,看起来像这样:
Gene = c("EIF4A1", "CAPNS1", "LDHA", "RPL38", "CCAR1")
Pep = c("TGKTATFAISILQQIELDLKA", "MFLVNSFLKGGGGG", "CAISILMKDLAD", "VITDKEKAEKLKQSL", "TPANYQLTQTAALQQQAA")
Seq = c("MSASQDSRSRDNGPDGMEPEGVIESNWNEIVDSFDDMNLSESLLRGIYAYGFEKPSAIQQRAILPCIKGYDVIAQAQSGTGKTATFAISILQQIELDLKATQALVL*",
"MFLVNSFLKGGGGGGGGGGGLGGGLGNVLGGLISGAGGGGGGGGGGGGGGGGGGGGTAMRILGGVISAISEAAAQYNPES*",
"MATLKDQLIYNLLKEEQTPQNKITVVGVGAVGMACAISILMKDLADELALVDVIEDKLKGEMMDLQHGSLFLRTPKIVSGKDVFTE",
"MPRKIEEIKDFLLTARRKDAKSVKIKKNKDNVKFKVRCSRYLYTLVITDKEKAEKLKQSLPPGLAVKELK*",
"MAQFGGQKNPPWATQFTATAVSQPAALGVQQPSLLGASPTIYTQQTALAAAGLTTQTPANYQLTQTAALQQQAAAAAAALQQQYSQPQDQKSKENGASV")
df_in = data.frame(Gene, Pep, Seq)
我想将"Pep"
中的序列与"Seq"
中的序列进行匹配,并报告匹配是否在"Seq"
中的序列的第一,第二,第三或第四季度之内。如果序列落在边界内,则考虑匹配度> 50%的四分之一。
所需的输出data.frame:
df_out = data.frame(Gene, Pep, Seq, Q1, Q2, Q3, Q4)
非常感谢您。
答案 0 :(得分:1)
对于第一个剪切,可以使用regexpr
查找第一个匹配的索引。然后使用Pep中点的索引来检查它位于哪个季度。
df_in = data.frame(Gene, Pep, Seq, stringsAsFactors=FALSE)
mapply(function(pp, sq) {
posn <- regexpr(pp, sq)[[1]]
midpt <- (posn + posn + nchar(pp) - 1) / 2
ceiling( midpt / nchar(sq) * 4 )
}, df_in$Pep, df_in$Seq)
此后,如果无法在Seq等中找到Pep的确切字符串,则可以开始处理1)之类的特殊情况。