R将用户定义的函数应用于列的每一行

时间:2015-02-17 14:04:21

标签: r apply

我有一个包含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>

1 个答案:

答案 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