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 :

Manipulation des tableaux


Sujet :

R

  1. #1
    Membre du Club
    Inscrit en
    Février 2008
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 61
    Points : 43
    Points
    43
    Par défaut Manipulation des tableaux
    Bonjour!

    J'aurais une question concernant la manipulation des entrées d'un tableau (data.frame). Dans mon tableau de données, les sept premières colonnes contiennent des entrées qui sont des chaînes de caractères (et qui sont identiques à l'intérieur de chaque colonne) et les cent suivantes contiennent des nombres. Ca donne à peu près ça:


    Entree1 Entree2 ... Entree7 Entree 8 Entree 9 ... Entree107


    Blabla1 Blabla2 ... Blabla7 1 0 2 ... 6
    Blabla1 Blabla2 ... Blabla7 2 6 4 ... 7
    Blabla1 Blabla2 ... Blabla7 3 9 3 ... 2
    ...


    J'aimerais créer un nouveau tableau d'une ligne avec les noms Blabla1 Blabla2 ... Blabla7 figurant dans les premières colonnes puis ayant la somme sur les lignes dans les cent colonnes suivantes. Dans l'exemple ci-dessus, cela donnerait:


    Entree1 Entree2 ... Entree7 Entree 8 Entree 9 ... Entree107


    Blabla1 Blabla2 ... Blabla7 6 15 9 ... 15

    Comment faire? Y a-t-il un moyen d'utiliser la fonction apply avec la fonction sum? Le problème c'est que les entrées ne sont pas toutes des nombres...

    Merci d'avance!!

  2. #2
    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 : 45
    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,

    Étrange tableau ! (je veux dire les sept premières colonnes, avec toutes les lignes identiques).

    Enfin, ce n'est pas le sujet !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cbind(tableau[1, 1:7], lapply(tableau[ ,8:107], sum, na.rm=TRUE))
    une data.frame est en fait un cas particulier de liste (une liste dont tous les éléments ont la même longueur). On peut donc utiliser lapply (ou sapply) pour faire une opération sur chaque colonne.
    L'option na.rm=TRUE, c'est pour ignorer les éventuelles valeurs manquantes.
    cbind, c'est pour coller les 7 premières colonnes (une seule ligne) à celles calculées avec lapply.

    sapply retourne un vecteur lorsque c'est possible : la façon de l'utiliser ici est donc (encore !) moins intuitive :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cbind(tableau[1, 1:7], t(sapply(tableau[ ,8:107], sum, na.rm=TRUE)))
    (transposition nécessaire). C'est pourquoi, dans ce cas précis, je ne l'utiliserais pas

  3. #3
    Membre du Club
    Inscrit en
    Février 2008
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 61
    Points : 43
    Points
    43
    Par défaut
    Merci pour la réponse!!!

    J'aurais une autre question: comment faire si je veux créer un tableau-ligne en gardant Blabla1 et Blabla4 dans les deux premières colonnes, puis le tableau formé de la somme.

    Mon code était, avec l'astuce d'avant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ligne<-cbind(table[1,1:7], lapply(table[ ,8:107], sum, na.rm=TRUE))
    Et je voudrais avoir quelque chose comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ligne<-cbind(table[1,1], table[1,4], lapply(table[ ,8:107],sum,na.rm=TRUE))
    Mais cette dernière commande me donne quelque chose de complètement différent...

    Merci d'avance !

  4. #4
    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 : 45
    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
    Citation Envoyé par circe Voir le message
    Et je voudrais avoir quelque chose comme:

    ligne<-cbind(table[1,1], table[1,4], lapply(table[ ,8:107],sum,na.rm=TRUE))

    Mais cette dernière commande me donne quelque chose de complètement différent...
    Essaye plutôt
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ligne <- cbind(table[1,  c(1,  4)], lapply(table[ , 8:107], sum, na.rm=TRUE))
    ou bien peut être
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ligne <- cbind(table[1, 1, drop=FALSE], table[1, 4, drop=FALSE], lapply(table[ , 8:107], sum, na.rm=TRUE))
    Par défaut, R essaye de transformer le résultat d'une extraction en un objet de la classe la plus simple possible.
    Par exemple,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    table[1 , 1]
    ## ou bien même
    table[ , 1]
    est un vecteur. L'option drop=FALSE permet de conserver la classe data.frame.

    PS. Utilise les balises code (bouton #) lorsque tu donne des exemples... et aère un peut le code avec des espaces, il sera plus facile à lire

  5. #5
    Membre du Club
    Inscrit en
    Février 2008
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 61
    Points : 43
    Points
    43
    Par défaut
    Merci beaucoup, ça marche!!! :-)

    J'ai une autre question: j'ai concaténé certaines lignes d'un tableau initial data.dat et dans mon nouveau "sous"-tableau, lorsque je l'affiche dans le terminal, j'ai toujours les numéros des lignes du tableau initial qui s'affichent :
    347
    567
    234
    ...
    Comment faire pour qu'une numérotation "normale" de lignes s'affiche ? C'est-à-dire :
    1
    2
    3
    ...
    Merci d'avance!!

  6. #6
    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 : 45
    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,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    row.names(tableau) <- 1:nrow(tableau)
    ou bien peut-être même
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    row.names(tableau) <- NULL
    Edit: ma remarque sur les balises code reste valable. Même sur des exemples simples (y compris données), ça aide vraiment à faire ressortir la structure de la question.

  7. #7
    Membre du Club
    Inscrit en
    Février 2008
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 61
    Points : 43
    Points
    43
    Par défaut
    Merci bien, ça marche!!!!! :-)

    J'aurais une autre question: existe-t-il une fonction qui permette de demander si un élément fait partie d'une liste donnée?

    Merci d'avance!

  8. #8
    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 : 45
    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,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    is.element(vecteur_elements, vecteur_ensemble)
    retourne un vecteur booléen de la même longeur que vecteur_elements, avec pour chaque élément de celui-ci
    • TRUE s'il est présent dans vecteur_ensemble
    • FALSE sinon



    PS. Lorsqu'une nouvelle question n'a plus grand chose à voir avec l'original, il vaut mieux créer une nouvelle discussion avec un titre en rapport. Ainsi, d'autres utilisateurs qui font une recherche sur le même sujet auront plus de chance de tomber sur la solution.

  9. #9
    Membre du Club
    Inscrit en
    Février 2008
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 61
    Points : 43
    Points
    43
    Par défaut
    Merci beaucoup!!! :-)

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

Discussions similaires

  1. Manipulation des tableaux
    Par tcheffa dans le forum Général Java
    Réponses: 7
    Dernier message: 09/08/2011, 02h21
  2. Manipulation des tableaux
    Par mine87 dans le forum Langage
    Réponses: 2
    Dernier message: 18/01/2010, 10h26
  3. [OPENOFFICE]Comment manipuler des tableaux de variants ?
    Par Unusual dans le forum API, COM et SDKs
    Réponses: 1
    Dernier message: 06/11/2008, 11h14
  4. Manipulation des tableaux
    Par driss80 dans le forum Fortran
    Réponses: 4
    Dernier message: 18/01/2008, 09h51
  5. manipulation des tableaux
    Par amine556 dans le forum Informix
    Réponses: 4
    Dernier message: 26/11/2007, 16h20

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