我有一个包含uniprot登录的数据框和这样的ID:
> a <- data.frame(protein=c("sp|A6NCE7|MP3B2_HUMAN,sp|Q9GZQ8|MLP3B_HUMAN","sp|A6NL28|TPM3L_HUMAN","sp|B5ME19|EIFCL_HUMAN,sp|Q99613|EIF3C_HUMAN"),stringsAsFactors=FALSE)
> a
protein
1 sp|A6NCE7|MP3B2_HUMAN,sp|Q9GZQ8|MLP3B_HUMAN
2 sp|A6NL28|TPM3L_HUMAN
3 sp|B5ME19|EIFCL_HUMAN,sp|Q99613|EIF3C_HUMAN
现在,我编写了一个函数,用于将每个字符串拆分为可用部分:
split.uniprot.string <- function(uniprot_string){
first.protein <- unlist(strsplit(uniprot_string,"[,]"))[1]
uniprot_accession <- unlist(strsplit(first.protein,"[|]"))[2]
uniprot_ID <- unlist(strsplit(first.protein,"[|]"))[3]
list(uniprot_ID=uniprot_ID, uniprot_accession=uniprot_accession)
}
如果我将它应用于单行,它可以正常工作:
> split.uniprot.string(a$protein[2])
$uniprot_ID
[1] "TPM3L_HUMAN"
$uniprot_accession
[1] "A6NL28"
但是,如果我尝试将它应用于数据帧的每一行,则该函数仅以某种方式正确应用于第一行(如果我在每一行上运行FOR循环,则会发生相同的情况):
> a$uniprot_ID <- apply(a,1,function(row) split.uniprot.string(a$protein)$uniprot_ID)
> a
protein uniprot_ID
1 sp|A6NCE7|MP3B2_HUMAN,sp|Q9GZQ8|MLP3B_HUMAN MP3B2_HUMAN
2 sp|A6NL28|TPM3L_HUMAN MP3B2_HUMAN
3 sp|B5ME19|EIFCL_HUMAN,sp|Q99613|EIF3C_HUMAN MP3B2_HUMAN
我需要更改什么,以便该函数在每一行中填写正确的uniprot_ID(即&#34; TPM3L_HUMAN&#34;在第2行和&#34; EIF3C_HUMAN&#34;在第3行)?< / p>
答案 0 :(得分:0)
我认为你的问题很复杂(除了&#34;拼写错误&#34;)。
据我了解,您对第一个&#34;序列&#34;的最后一部分,最后一个|
后的那个感兴趣?
如果是这样,你可以这样做:
a$uniprot_ID <- gsub("^sp\\|{1}[^|]+\\|{1}([^|,]+)($|,.*)","\\1",a$protein)
a
# protein uniprot_ID
#1 sp|A6NCE7|MP3B2_HUMAN,sp|Q9GZQ8|MLP3B_HUMAN MP3B2_HUMAN
#2 sp|A6NL28|TPM3L_HUMAN TPM3L_HUMAN
#3 sp|B5ME19|EIFCL_HUMAN,sp|Q99613|EIF3C_HUMAN EIFCL_HUMAN
如果您还希望第一个|
之后的部分用于第一个&#34;序列&#34; (如果是逗号),您可以这样做:
a$uniprot_accession <- gsub("^sp\\|{1}([^|]+).*","\\1",a$protein)
a
# protein uniprot_ID uniprot_accession
#1 sp|A6NCE7|MP3B2_HUMAN,sp|Q9GZQ8|MLP3B_HUMAN MP3B2_HUMAN A6NCE7
#2 sp|A6NL28|TPM3L_HUMAN TPM3L_HUMAN A6NL28
#3 sp|B5ME19|EIFCL_HUMAN,sp|Q99613|EIF3C_HUMAN EIFCL_HUMAN B5ME19