IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

R Discussion :

Mean par colonne dans une data frame


Sujet :

R

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 73
    Points : 80
    Points
    80
    Par défaut Mean par colonne dans une data frame
    Bonjour à tous,

    Je cherche à faire une moyenne par colonne de mes gène dupliqués dans une data frame, ci dessous un petit échantillon de ma table :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
                  TragetID  MeanTEM   MeanEarly MeanLate
    1               7A5     4.968226  4.953398  4.953113
    2               A1BG    5.128535  5.115278  5.090601
    3               A1BG    4.983317  4.965609  4.978165
    4               A1CF    4.941948  4.970928  4.909220
    5               A1CF    4.999109  4.990280  5.002853
    6               A1CF    4.979658  4.953091  4.975701
    7               A26A1   4.921363  4.984621  4.989640
    8               A26A1   4.976296  4.962460  4.969358
    9               A26B1   4.976480  4.986532  4.978985
    10             A26C1B   4.975744  4.999202  4.990513
    Je cherche à faire le mean de mes gènes qui se répètent selon TragetID:
    ex faire la moyenne de 2 et 3 ligne, et de 3,4 et 5 lignes
    Existe-t-il une fonction R qui fait cela ?

    Merci par avance
    manoir

  2. #2
    Membre du Club
    Inscrit en
    Septembre 2007
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 32
    Points : 41
    Points
    41
    Par défaut
    Bonjour,
    Je suppose qu'il y a plus simple que ce que je vais te proposer comme code. Je ne sais pas si une telle fonction existe, mais avec un subset et un nlevels, ca doit fonctionner.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    nlev <- nlevels(as.factor(levels(dat[,1])))
    lev <- levels(dat[,1])
    meanss <- matrix(ncol=ncol(dat),nrow=nlev)
    for (i in 1:nlev) {
        dat2 <- subset(dat,dat[,1]==lev[i])
        meanss[i,2:ncol(dat)] <- mean(dat2[2:ncol(dat)])
        meanss[i,1] <- lev[i]
    }
    S'il y a plus simple, je suis aussi preneuse !

  3. #3
    Membre expert
    Avatar de pitipoisson
    Homme Profil pro
    Chercheur
    Inscrit en
    Septembre 2006
    Messages
    1 942
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Chercheur
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 942
    Points : 3 378
    Points
    3 378
    Par défaut
    Bonjour,
    Citation Envoyé par doguette Voir le message
    S'il y a plus simple, je suis aussi preneuse !
    Plus simple, peut-être pas, mais plus direct et recommandé avec R (pour des raisons d'efficacité), oui !

    Si j'ai bien compris la question, il faudrait faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    > sapply(data[ , 2:ncol(data)],
    +        function(x)
    +    {
    +        tapply(x, data[ , 1], mean, na.rm=TRUE)
    +    })
     
            MeanTEM MeanEarly MeanLate
    7A5    4.968226  4.953398 4.953113
    A1BG   5.055926  5.040444 5.034383
    A1CF   4.973572  4.971433 4.962591
    A26A1  4.948830  4.973541 4.979499
    A26B1  4.976480  4.986532 4.978985
    A26C1B 4.975744  4.999202 4.990513
    Explications :
    1. sapply applique une fonction à chaque élément d'une liste/colonne d'une data.frame (l'argument x de notre fonction est tour à tour la colonne 2, puis 3, etc.)
    2. tapply applique à chaque subset d'un vecteur (x), définit par un facteur (data[ , 1]) une fonction (mean). Les arguments suivants sont les arguments suivants/optionnels de la fonction.
    3. sapply simplifie si possible le résultat en matrice (contrairement à lapply, qui renvoie une liste mais fait la même chose pour le reste)


    De façon générale, la famille des fonctions apply est fortement recommandée à la place des boucles car nettement plus optimales côté temps de calcul (j'avais certaines boucles qui tournaient en 10 ou 20 minutes et j'ai réussi à descendre à quelques dizaines de secondes ou - avec des [t|l|s|]]apply !).
    Forum LaTeX : pour des réponses rapides et appropriées, pensez à poster un
    ECM = Exemple (reproduit le problème) Complet (document compilable) Minimal (ne postez pas votre thèse !)

    Une solution vous convient ? N'oubliez pas le tag


    )><))))°>

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 73
    Points : 80
    Points
    80
    Par défaut
    Bonjour,

    Merci bcp pour vos ces réponses intéréssantes, la fonction aggregate marche aussi en une ligne de code pour la calculer la moyenne par colonnes!

    Bien à vous

    Manoir

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Rajout d'une colonne dans une data frame
    Par kalapiso dans le forum R
    Réponses: 2
    Dernier message: 23/10/2011, 14h43
  2. Suppression de colonnes dans un data.frame
    Par ricoben dans le forum R
    Réponses: 1
    Dernier message: 13/04/2010, 17h13
  3. Réponses: 2
    Dernier message: 18/06/2009, 15h09
  4. Réponses: 2
    Dernier message: 14/11/2008, 14h53

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo