Объединение всех элементов во 2-м столбце с тем же элементом в 1-м столбце

#r #dataframe

#r #фрейм данных

Вопрос:

Я работаю над данными аннотации белка. Ниже вы можете увидеть пример фрейма входных данных:

  UNIPROT          CLASS_TERM
 A6NDV4           cell adhesion molecule
 O00186           membrane traffic protein
 O00186           membrane trafficking regulatory protein
 O00186           transporter
 O00401           actin family cytoskeletal protein
 O00401           cytoskeletal protein
 O00422           DNA binding protein
 O00422           chromatin/chromatin-binding protein
 O00422           nucleic acid binding
 

Что я хочу сделать, так это снова создать еще один фрейм данных с двумя столбцами (1-й столбец: UNIPROT, 2-й: CLASS_TERM). Однако я хочу объединить все значения во 2-м столбце, принадлежащие одному и тому же значению UNIPROT.

Вот краткий пример желаемого результата:

 UNIPROT                          CLASS_TERM
 A6NDV4                          cell adhesion molecule
 O00186                          membrane traffic protein;membrane trafficking regulatory;transporter protein
 

Большое спасибо за вашу помощь!

Лучшие,

Ответ №1:

Вы также можете использовать toString таким образом:

 #Code
res <- aggregate(CLASS_TERM~UNIPROT,df,function(x) toString(x,sep=';'))
res$CLASS_TERM <- gsub(', ',';',res$CLASS_TERM)
 

Вывод:

 res
  UNIPROT                                                                   CLASS_TERM
1  A6NDV4                                                       cell adhesion molecule
2  O00186 membrane traffic protein;membrane trafficking regulatory protein;transporter
3  O00401                       actin family cytoskeletal protein;cytoskeletal protein
4  O00422 DNA binding protein;chromatin/chromatin-binding protein;nucleic acid binding
 

Ответ №2:

Мы можем использовать aggregate from base R в одной строке

 aggregate(CLASS_TERM ~ UNIPROT, df1, paste, collapse = ';')
 

-вывод

 # UNIPROT                                                                   CLASS_TERM
#1  A6NDV4                                                       cell adhesion molecule
#2  O00186 membrane traffic protein;membrane trafficking regulatory protein;transporter
#3  O00401                       actin family cytoskeletal protein;cytoskeletal protein
#4  O00422 DNA binding protein;chromatin/chromatin-binding protein;nucleic acid binding
 

Или с tidyverse

 library(dplyr)
library(stringr)
df1 %>%
   group_by(UNIPROT) %>%
   summarise(CLASS_TERM = str_c(CLASS_TERM, collapse=";"), .groups = 'drop')
 

данные

 df1 <- structure(list(UNIPROT = c("A6NDV4", "O00186", "O00186", "O00186", 
"O00401", "O00401", "O00422", "O00422", "O00422"), CLASS_TERM = c("cell adhesion molecule", 
"membrane traffic protein", "membrane trafficking regulatory protein", 
"transporter", "actin family cytoskeletal protein", "cytoskeletal protein", 
"DNA binding protein", "chromatin/chromatin-binding protein", 
"nucleic acid binding")), class = "data.frame", row.names = c(NA, 
-9L))