sous tableau selectionnant une ligne plus la suivante selon condition sur la premiere

Postez ici vos questions, réponses, commentaires ou suggestions - Les sujets seront ultérieurement répartis dans les archives par les modérateurs

Modérateur : Groupe des modérateurs

Delalande Lucas
Messages : 40
Enregistré le : 14 Déc 2017, 08:48

sous tableau selectionnant une ligne plus la suivante selon condition sur la premiere

Messagepar Delalande Lucas » 12 Jan 2018, 09:53

Bonjour,

Un cas un peu spécial :

je voudrais un sous tableau sélectionnant uneligne plus la suivante selon une condition faite sur la première ligne ,

imaginons le DF suivant :

a b c d
0 0 0 0
0 0 3 0
0 1 0 0
0 0 2 4
0 0 0 0

j’aimerais obtenir le tableau selon la condition suivante :
"si la colonne b est différente de 0 et que la colonne c et d sont égale a 0; alors je veux dans un nouveau tableau cette ligne ainsi que la suivante"

J'ai tenté des trucs du genre :
for (i in nrow(DF)) {
ifelse((DF$b !=0)&(DF$c==0)&(DF$d==0),subset(DF, DF [i:(i+1), ] ) }

mais bien sur ca ne peut pas marcher car il me manque élements dans cette boucle.. ce qui me bloque un peu car je ne vois pas comment faire !

Merci a vous ! :)

Mickael Canouil
Messages : 1315
Enregistré le : 04 Avr 2011, 08:53
Contact :

Re: sous tableau selectionnant une ligne plus la suivante selon condition sur la premiere

Messagepar Mickael Canouil » 12 Jan 2018, 10:10

Bonjour,

voici une proposition.

Code : Tout sélectionner

dta <- read.table(header = TRUE, text = "a b c d
0 0 0 0
0 0 3 0
0 1 0 0
0 0 2 4
0 0 0 0")

indices <- which(dta[, "b"]!=0 & dta[, "c"]==0 & dta[, "d"]==0) # retourne les numéros de ligne validant vos conditions
indicesPlusOne <- sort(c(indices, indices+1))
newdta <- dta[indicesPlusOne , ]


Cordialement,
Mickaël
mickael.canouil.fr | rlille.fr

Michaël Delorme
Messages : 67
Enregistré le : 04 Avr 2016, 10:21

Re: sous tableau selectionnant une ligne plus la suivante selon condition sur la premiere

Messagepar Michaël Delorme » 12 Jan 2018, 10:49

Une autre proposition...

Code : Tout sélectionner

library(tidyverse)
df <- read_delim("a b c d
0 0 0 0
0 0 3 0
0 1 0 0
0 0 2 4
0 0 0 0", delim = " ")

df %>%
  mutate(sel = b != 0 & c == 0 & d == 0,
         sel = sel | (lag(sel) & !is.na(lag(sel)))) %>%
  filter(sel) %>%
  select(-sel)

Delalande Lucas
Messages : 40
Enregistré le : 14 Déc 2017, 08:48

Re: sous tableau selectionnant une ligne plus la suivante selon condition sur la premiere

Messagepar Delalande Lucas » 12 Jan 2018, 15:28

ca marche nickel merci beaucoup !

tant qu'on y est, je me permet une autre question :

comment faire la somme des valeurs d'une colonne selon le factor (levels) d'une (ou de deux) autre(s) colonne(s) ?

un espèce d'apply de tapply ?

Mickael Canouil
Messages : 1315
Enregistré le : 04 Avr 2011, 08:53
Contact :

Re: sous tableau selectionnant une ligne plus la suivante selon condition sur la premiere

Messagepar Mickael Canouil » 15 Jan 2018, 09:32

Bonjour,

voici deux solutions possibles (il y en a d'autres):

Code : Tout sélectionner

library(tidyverse)
df %>%
   group_by(Fac1, Fac2) %>%
   summarise(Somme = sum(myvariable))


Code : Tout sélectionner

by(df, df[, c("Fac1", "Fac2")], function (dta) {
   sum(dta[, "myvariable"])
}


Note:
  1. "tidyverse" est chargé ici notamment pour le package "dplyr"
  2. "by" est un wrapper de "tapply"
Mickaël
mickael.canouil.fr | rlille.fr

Bertrand Vassor
Messages : 46
Enregistré le : 18 Sep 2017, 10:18

Re: sous tableau selectionnant une ligne plus la suivante selon condition sur la premiere

Messagepar Bertrand Vassor » 16 Jan 2018, 06:46

Bonjour,

Une simple remarque sur la solution proposée par M Canouil sur un effet de bord possible. Si la dernière ligne du dta répond aux conditions, le newdta contient une ligne de plus en NA.
Cdlt
B

Mickael Canouil
Messages : 1315
Enregistré le : 04 Avr 2011, 08:53
Contact :

Re: sous tableau selectionnant une ligne plus la suivante selon condition sur la premiere

Messagepar Mickael Canouil » 16 Jan 2018, 08:39

Bonjour,

@Bertrand: ce n'est pas faux
Il suffit d'un petit contrôle additionnel pour éviter de sélectionner un indice qui excède la taille du data.frame.

Cela dit, de part l'énoncé, il semblerait que les lignes du data.frame fonctionnent de paire. Ce problème de bord ne devrait donc pas survenir.

Code : Tout sélectionner

dta <- read.table(header = TRUE, text = "a b c d
0 0 0 0
0 0 3 0
0 1 0 0
0 0 2 4
0 0 0 0")

indices <- which(dta[, "b"]!=0 & dta[, "c"]==0 & dta[, "d"]==0) # retourne les numéros de ligne validant vos conditions
indicesPlusOne <- sort(c(indices, indices+1))
newdta <- dta[indicesPlusOne[indicesPlusOne<=nrow(dta)] , ]
Mickaël
mickael.canouil.fr | rlille.fr

Bertrand Vassor
Messages : 46
Enregistré le : 18 Sep 2017, 10:18

Re: sous tableau selectionnant une ligne plus la suivante selon condition sur la premiere

Messagepar Bertrand Vassor » 16 Jan 2018, 08:45

Bonjour,

@ Mickael : c'était juste une remarque et le contrôle proposé (que j'aurais dû mettre dans la réponse) répond à cet effet de bord ;-)


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité

cron