2017-04-18 1 views
-1

Salut, je voudrais agréger plusieurs colonnes.agréger les colonnes par caractère

d <- structure(list(Gene = structure(1:3, .Label = c("k141_20041_1", 
"k141_27047_2", "k141_70_3"), class = "factor"), phylum = structure(c(1L, 
1L, 1L), .Label = "Firmicutes", class = "factor"), class = structure(c(1L, 
1L, 1L), .Label = "Bacillales", class = "factor"), order = structure(c(1L, 
1L, 1L), .Label = "Bacilli", class = "factor"), family = structure(c(1L, 
1L, 1L), .Label = "Bacillaceae", class = "factor"), genus = structure(c(1L, 
1L, 1L), .Label = "Bacillus", class = "factor"), species = structure(c(1L, 
1L, 2L), .Label = c("Bacillus subtilis", "unknown"), class = "factor"), 
    SampleA = c(0, 0, 0), SampleB = c(0, 0, 0), SampleCtrl = c(3.98888888888889, 
    11.5555555555556, 3.35978835978836)), .Names = c("Gene", 
"phylum", "class", "order", "family", "genus", "species", "SampleA", 
"SampleB", "SampleCtrl"), row.names = c(21918L, 40410L, 40857L 
), class = "data.frame") 

Ce dans la trame de données d'entrée pour agréger

Gene  phylum  class order  family genus   species SampleA SampleB 
k141_20041_1 Firmicutes Bacillales Bacilli Bacillaceae Bacillus Bacillus subtilis  0  0 
k141_27047_2 Firmicutes Bacillales Bacilli Bacillaceae Bacillus Bacillus subtilis  0  0 
k141_70_3 Firmicutes Bacillales Bacilli Bacillaceae Bacillus   unknown  0  0 
    SampleCtrl 
    3.99 
11.56 
    3.36 

Ce que je veux à la fin est une ligne unique avec toutes les colonnes. Dans ce cas, cela ressemblerait à ceci (nous pouvons supprimer la colonne du gène).

phylum class order family genus species SampleA SampleB SampleCtrl 
    Firmicutes Bacillales Bacilli Bacillaceae Bacillus Bacillus subtilis  0  0  15.6 
    Firmicutes Bacillales Bacilli Bacillaceae Bacillus Bacillus Unknown  0  0  3.36 

Notez que c'est un exemple très simple. J'ai 20 échantillons et plus de 500 espèces dans la base de données originale.

Répondre

0

est ici une solution dplyr:

library(dplyr) 
d%>% 
group_by(phylum,class,order,family,genus, species)%>% 
summarise_if(is.numeric, sum)  
Groups: phylum, class, order, family, genus [?] 

     phylum  class order  family genus   species SampleA SampleB SampleCtrl 
     <fctr>  <fctr> <fctr>  <fctr> <fctr>   <fctr> <dbl> <dbl>  <dbl> 
1 Firmicutes Bacillales Bacilli Bacillaceae Bacillus Bacillus subtilis  0  0 15.54444 
2 Firmicutes Bacillales Bacilli Bacillaceae Bacillus   unknown  0  0 3.35979 
+0

Je veux regrouper toutes les colonnes d'échantillons (pas seulement la colonne samplectrl). Ce n'était pas clair à partir de ma question. Cet exemple aggreagate seulement la colonne Samplectrl. J'ai plus de 20 colonne, dois-je les énumérer tous dans un tel cas ?? – david

+0

@david J'ai édité ma réponse. SampleA et SampleB sont maintenant additionnés car ils sont également numériques. –

+0

Grands travaux parfaits. Merci beaucoup – david

0

En supposant que les colonnes échantillons sont numériques et les autres ne sont pas et que l'agrégation désirée consiste à additionner chaque groupe de colonne d'échantillons par les autres colonnes (sauf Gene):

j <- which(sapply(d, is.numeric)) 
aggregate(d[j], d[-c(1, j)], sum) 

donnant:

 phylum  class order  family genus   species SampleA 
1 Firmicutes Bacillales Bacilli Bacillaceae Bacillus Bacillus subtilis  0 
2 Firmicutes Bacillales Bacilli Bacillaceae Bacillus   unknown  0 
    SampleB SampleCtrl 
1  0 15.544444 
2  0 3.359788 

Ano Ther possibilité si les colonnes échantillons ont tous Sample en leur nom et les autres colonnes ne pas est d'utiliser ce lieu de la première ligne ci-dessus:

j <- grep("Sample", names(d)) 

ou si aucune des hypothèses ci-dessus tiennent alors si nous savons que la colonnes échantillons sont les 3 dernières colonnes puis:

j <- seq(to = ncol(d), length = 3) 

Mise à jour: fixe et ajouté deux alternatives.

+0

Merci ça marche aussi !!! Toutes les colonnes d'échantillons sont en effet numériques. Ils ont des noms différents mais merci pour la réponse – david