#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))