2015-02-17 2 views
0

У меня есть dataframe, содержащий UniProt присоединения к ней и идентификаторы вроде этого:R применяя пользовательскую функцию к каждой строке в столбце

> 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" 

Однако, если я пытаюсь применить его к каждой строке dataframe, функция как-то применяется только к первой строке правильно (то же самое происходит, если я бегу для цикла по каждой строке):

> 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 в каждой строке (т. е. «TPM3L_HUMAN» в строке 2 и «EIF3C_HUMAN» в строке 3)?

+0

'function (row) split.uniprot.string ($ protein) $ uniprot_ID': вы должны изменить' a' на 'row', так как это переменная вашей функции ... (и вы не можете использовать' $ protein 'и т. д. как' row' является 'vector') – Cath

+0

Спасибо! Работает отлично! – Flo

+0

Просто для полноты: в таблице примеров был только один столбец. Если вы применяете функцию более чем к одному столбцу, вам нужно добавить индекс столбца в строку, т. Е. Функцию (строку) split.uniprot.string (строка ['column-index']). – Flo

ответ

0

Я думаю, что вы немного усложнили свою проблему (помимо «опечатки»).

Насколько я понимаю, вас интересует последняя часть первой «последовательности», после последней |?

Если да, то вы можете сделать:

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 

и если вы хотите, часть после первой | для первой «последовательности» (в случае запятой), вы можете сделать:

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 
+0

Спасибо, также работает красиво! Я не знал функцию gsub. – Flo

+0

@Flo, приветствую :-), 'gsub' очень практично заменить что-то в строке чем-то другим, но также можно использовать, как здесь, для извлечения части строки – Cath

+1

Хотя, глядя на ваш код , Я не уверен, какой подход более сложный :-) – Flo

Смежные вопросы