6
votes

Concaténer plusieurs colonnes aux chaînes séparées par virgule par groupe

Contexte: Je suis en train d'annoter des SNP d'un GWAS dans un organisme sans beaucoup d'annotation. J'utilise la table Tblastn enchaînée de l'UCSC avec BioMart pour mapper chaque SNP à un (s) gène (s) probable (s).

J'ai un dataframe qui ressemble à ceci: p> xxx pré>

Ce que je voudrais finir avec est une rangée unique pour chaque SNP et la virgule délimit les gènes et hu_mrnas . Voici ce que je suis après: p>

            SNP            hu_mRNA    gene
 chr1.111642529 NM_002107,NM_005324   H3F3A
 chr1.111801684  BC098118,NM_020435   GJC2
  chr1.11801605  AK027740,NM_032849   C13orf33
 chr1.151220354 NM_018913,NM_018918   PCDHGA10,PCDHGA5

r

0 commentaires

5 Réponses :


9
votes

Vous pouvez utiliser agrégat code> avec coller code> pour chacun et Fusionner code> à la fin:

x <- structure(list(SNP = structure(c(1L, 1L, 2L, 3L, 4L, 4L, 5L, 
5L), .Label = c("chr1.111642529", "chr1.111801684", "chr1.111925084", 
"chr1.11801605", "chr1.151220354"), class = "factor"), hu_mRNA = structure(c(3L, 
4L, 2L, 7L, 1L, 8L, 5L, 6L), .Label = c("AK027740", "BC098118", 
"NM_002107", "NM_005324", "NM_018913", "NM_018918", "NM_020435", 
"NM_032849"), class = "factor"), gene = structure(c(4L, 5L, 1L, 
3L, 1L, 2L, 6L, 7L), .Label = c("<NA>", "C13orf33", "GJC2", "H3F3A", 
"H3F3B", "PCDHGA10", "PCDHGA5"), class = "factor")), .Names = c("SNP", 
"hu_mRNA", "gene"), class = "data.frame", row.names = c(NA, -8L
))

a1 <- aggregate(hu_mRNA~SNP,data=x,paste,sep=",")
a2 <- aggregate(gene~SNP,data=x,paste,sep=",")
merge(a1,a2)
             SNP              hu_mRNA              gene
1 chr1.111642529 NM_002107, NM_005324      H3F3A, H3F3B
2 chr1.111801684             BC098118              <NA>
3 chr1.111925084            NM_020435              GJC2
4  chr1.11801605  AK027740, NM_032849    <NA>, C13orf33
5 chr1.151220354 NM_018913, NM_018918 PCDHGA10, PCDHGA5


3 commentaires

Brillant!! Merci! Je ne connaissais pas la fonction agrégate . J'ai légèrement modifié pour supprimer les espaces après les virgules, par exemple: A1 <- Agrégat (Hu_Mrna ~ SNP, données = x, pâte, collapse = ",") A2 <- Gene ~ SNP, données = x, Coller, collapse = ",")


@CadDymob Bon appel, il semble que sep n'a aucun effet dans ce cas, seul effondrement fait.


@James. La solution de Gabor a suggéré qu'une doublure avec collapse = "," fonctionnerait.



12
votes

Vous pouvez le faire dans une ligne en une ligne en utilisant plyr code>, car il s'agit d'un "code" classique Split-apply-combinez le problème code> problème. Vous divisez à l'aide de SNP code>, appliquez Coller code> avec Collapse code> et assemblez les pièces dans une trame de données. xxx pré>

Si vous souhaitez faire Data ​​CODE> Reshaping dans R au niveau de la touche FLICK d'un poignet code>, apprendre Plyr code> et reshape2 code> :). Une autre vagabonde de la solution de poignet utilisant data.table code>, vraiment utile si vous avez affaire à des quantités massives de données. P>

data.table::data.table(x)[,lapply(.SD, paste, collapse = ","),'SNP']


0 commentaires

5
votes

Configurez d'abord les données de test. Notez que nous avons rendu les colonnes à être de "caractère" code> classe plutôt que "facteur" code> à l'aide de as.is = true code>:

> aggregate(. ~ SNP, DF, toString)
             SNP              hu_mRNA              gene
1 chr1.111642529 NM_002107, NM_005324      H3F3A, H3F3B
2 chr1.111925084            NM_020435              GJC2
3  chr1.11801605            NM_032849          C13orf33
4 chr1.151220354 NM_018913, NM_018918 PCDHGA10, PCDHGA5


1 commentaires

Et par le même principe, cela devrait réussir: agrégat (. ~ SNP, DF, pâte, collapse = ",")



1
votes

Ceci peut également être résolu en utilisant reshape2 's fond / dcast Opérations. Avec cette approche, fond transforme d'abord les données en format "long", puis les valeurs sont dcast avec la même opération, coller (... , collapse = ",") : xxx


0 commentaires

1
votes

Voici une solution dplyr , que l'IHMO est la plus lisible: xxx

résultat: xxx


0 commentaires