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 :

Supression de celulles par ligne selon valeur cellule précédente


Sujet :

R

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Homme Profil pro
    Doctorant
    Inscrit en
    Juin 2018
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Canada

    Informations professionnelles :
    Activité : Doctorant

    Informations forums :
    Inscription : Juin 2018
    Messages : 3
    Par défaut Supression de celulles par ligne selon valeur cellule précédente
    Bonjour

    Je possède une matrice que je dois "nettoyer" avant analyses. Chaque fin de chaîne de donnée est marquée du code "S", ensuite la ligne affiche 0 jusqu'à la fin du tableur. J'aimerais supprimer ces zéros, par ligne, selon une expressions du type if (valeur cellule précédente = S) {valeur de la cellule suivante jusqu'à la dernière = rien, suppression des zéros}

    et accessoirement remplacer ensuite tous les S par des "vrais" zéros mais je pense que je peux manager ça !

    Quelqu'un a-t'il une idée ?

    Un grand merci d'avance je viens de SAS et débute sous R parce qu'il faut bien
    Alex

  2. #2
    Membre chevronné
    Inscrit en
    Février 2011
    Messages
    276
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 276
    Par défaut
    Bonjour,

    pour moi ta question est trop vague, on ne voit pas clairement ce que tu cherches à faire. Peut-être qu'en donnant un exemple clair de l'objet que tu as au départ et de ce que tu souhaites obtenir ça t'aiderait à avoir une réponse.

    cdlt

  3. #3
    Candidat au Club
    Homme Profil pro
    Doctorant
    Inscrit en
    Juin 2018
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Canada

    Informations professionnelles :
    Activité : Doctorant

    Informations forums :
    Inscription : Juin 2018
    Messages : 3
    Par défaut
    Bonjour,
    un exemple visuel de la structure de mes données :

    colonnes : années
    lignes : échantillons

    ID 2017 2016 2015 2014 2013 2012 2011 2010 2009 2008 2007 etc...
    ECH1 1 0 1 1 0 1 1 0 S 0 0 0
    ECH2 1 0 1 0 1 S 0 0 0 0 0 0

    La fin de chaque série de données est signalé par un "S" : la ligne affiche des 0 sur les colonnes suivantes. La position du S change à chaque ligne.

    PROBLÈME : les 0 sont une valeur en soit, que je vais analyser dans mes intervalles [début - S] : Je ne peux pas faire une recherche textuelle pour les supprimer parce qu'il y a des "vrais" (intervalle [début - S]) et des "faux" zéros (après le S).

    OBJECTIF 1 : la matrice doit afficher NA (= case vide, absence de données) à la place des 0 qui suivent le S sur chaque ligne.

    OBJECTIF 2 : le signe S n'a également pas sa place dans les données à analyser, et doit être remplacer par un seul 0.

    Le rendu devrait donc donner :

    ID 2017 2016 2015 2014 2013 2012 2011 2010 2009 2008 2007 etc...
    ECH1 1 0 1 1 0 1 1 0 0(new) NA NA NA
    ECH2 1 0 1 0 1 0(new) NA NA NA NA NA NA

    Je n'arrive pas à écrire une boucle for / if / else qui se tienne sous R, pour réaliser ça...
    J'espère que c'est plus clair maintenant

  4. #4
    Expert confirmé
    Avatar de olivier.decourt
    Homme Profil pro
    Formateur R/SAS/statistiques
    Inscrit en
    Avril 2008
    Messages
    2 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations professionnelles :
    Activité : Formateur R/SAS/statistiques
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 064
    Par défaut
    Bonjour.
    Il y a très probablement quelque chose de beaucoup plus élégant à faire, mais voici une première solution avec des boucles for, des if et des else comme tu cherchais.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    # exemple fourni
    test <- rbind(t(c(1, 	0, 	1, 	1, 	0, 	1, 	1, 	0, 	"S", 	0, 	0, 	0)),
                  t(c(1, 	0, 	1, 	0, 	1, 	"S", 	0, 	0, 	0, 	0, 	0, 	0)))
    colnames(test) <- as.character(2017:2006)
     
    # on boucle sur les lignes, puis sur les colonnes
    # pos_s contient le n° de la colonne avec un S
    for (i in 1:nrow(test)){
      pos_s <- NA
      for (j in 1:ncol(test)){
        if(!is.na(pos_s)) {
          test[i,j] <- NA
        }
        else {
          if(test[i,j]=="S"){
          pos_s <- j
          test[i,j] <- 0
          }
        }
      }
    }
    Et puis une alternative qui évite les boucles : éclater avec split les données en liste (1 élément = 1 ligne de données). Avec sapply, appliquer sur chaque élément une fonction qui repère le S et modifie le contenu du vecteur en fonction de sa position. Réagréger le tout (avec une transposition bonus car sapply crée une matrice tournée d'un quart de tour par rapport aux données initiales).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    # exemple fourni
    test <- rbind(t(c(1, 	0, 	1, 	1, 	0, 	1, 	1, 	0, 	"S", 	0, 	0, 	0)),
                  t(c(1, 	0, 	1, 	0, 	1, 	"S", 	0, 	0, 	0, 	0, 	0, 	0)))
    colnames(test) <- as.character(2017:2006)
    rownames(test) <- c("ECH1","ECH2")
     
    test <- t(sapply(split(test,rownames(test)), 
                   function(vect){
                     pos_s <- which(vect == "S")
                     res <- vect
                     res[pos_s:length(vect)] <- NA
                     res[pos_s] <- 0
                     return(res)
                     }
                   )
      )

  5. #5
    Candidat au Club
    Homme Profil pro
    Doctorant
    Inscrit en
    Juin 2018
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Canada

    Informations professionnelles :
    Activité : Doctorant

    Informations forums :
    Inscription : Juin 2018
    Messages : 3
    Par défaut
    Merci Olivier, ça fonctionne parfaitement et de nouvelles perspectives pour moi avec tes fonctions sapply et split!

Discussions similaires

  1. [XL-2007] insertion ligne selon valeur cellule
    Par royal cruiser dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 12/05/2018, 17h08
  2. Suppression ligne selon valeur présente dans une cellule
    Par a.petitjean1 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 07/07/2017, 09h55
  3. [XL-2013] Vérrouiller une ligne en ecriture selon valeur cellule même ligne
    Par UDSP50 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 31/10/2016, 15h12
  4. [XL-2013] Supression lignes selon valeurs
    Par Troutchu dans le forum Macros et VBA Excel
    Réponses: 12
    Dernier message: 24/06/2015, 15h28
  5. [XL-2010] Nb lignes selon valeur dans cellules
    Par Riko63 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 18/12/2013, 19h49

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