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> 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
5 Réponses :
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
Brillant!! Merci! Je ne connaissais pas la fonction code> agrégate code>. 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 = ",") code>
@CadDymob Bon appel, il semble que sep code> n'a aucun effet dans ce cas, seul effondrement code> fait.
@James. La solution de Gabor a suggéré qu'une doublure avec collapse = "," code> fonctionnerait.
Vous pouvez le faire dans une ligne en une ligne en utilisant Si vous souhaitez faire 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. 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']
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
Et par le même principe, cela devrait réussir: agrégat (. ~ SNP, DF, pâte, collapse = ",") code>
Ceci peut également être résolu en utilisant reshape2 code> 's fond / dcast code> Opérations. Avec cette approche, fond code> transforme d'abord les données en format "long", puis les valeurs sont dcast code> avec la même opération, coller (... , collapse = ",") code>:
Voici une solution résultat: p> dplyr code>, que l'IHMO est la plus lisible: