extraire des données d'un data frame

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

Fabrice Yaméogo
Messages : 24
Enregistré le : 22 Mar 2019, 10:09

extraire des données d'un data frame

Messagepar Fabrice Yaméogo » 30 Juil 2019, 10:38

Bonjour,
je voudrais solliciter une fois de plus votre aide.
J'ai un tableau dont voici une version simplifiée:

Code : Tout sélectionner

df<-data.frame(id=c("A","A","A","B","B","B"),x_1=c("True","False","False","True","False","False"),x_2=c("True","False","False","True","False","False"),x_3=c("False","True","False","True","False","False"), x_4=c("False","True","False","False","True","False"),motifs=c("Travail","sante","shopping","Travail","sante","shopping"))

Ce tableau donne les séquences d'activité de deux individus.
Les variables x_1,x_2,x_3, x_4 représentent des tranches horaires. J'ai donc une ligne par individu et motif.

Je souhaiterais, à partir de ce tableau obtenir le tableau suivant:

Code : Tout sélectionner

df1<-data.frame(id=c("A","B"),x_1=c("Travail","Travail"),x_2=c("Travail","Travail"),x_3=c("Sante","Travail"),x_4=c("Sante","Sante"))


afin d'avoir directement les activités menées par chaque individu selon les tranches horaires.

Dans l'espoir que vous pourrez m'aider.
Merci d'avance
Fabrice

Pierre-Yves Berrard
Messages : 1029
Enregistré le : 12 Jan 2016, 23:30

Re: extraire des données d'un data frame

Messagepar Pierre-Yves Berrard » 30 Juil 2019, 11:19

Bonjour,

Une proposition avec le package dplyr.

Code : Tout sélectionner

library(dplyr)

df %>%
  group_by(id) %>%
  summarise(
    x_1 = motifs[x_1 == "True"],
    x_2 = motifs[x_2 == "True"],
    x_3 = motifs[x_3 == "True"],
    x_4 = motifs[x_4 == "True"]
  )
PY

Fabrice Yaméogo
Messages : 24
Enregistré le : 22 Mar 2019, 10:09

Re: extraire des données d'un data frame

Messagepar Fabrice Yaméogo » 30 Juil 2019, 11:45

Cela marche très bien.
Merci
Fabrice

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

Re: extraire des données d'un data frame

Messagepar Mickael Canouil » 30 Juil 2019, 11:46

Bonjour,

une petite variante de la proposition de Pierre-Yves pour éviter la redondance du code.

Code : Tout sélectionner

library(dplyr)

df %>%
  group_by(id) %>%
  summarise_at(
    .vars = vars(starts_with("x_")),
    .funs = ~motifs[.x%in%"True"]
  )
#> # A tibble: 2 x 5
#>   id    x_1     x_2     x_3     x_4 
#>   <fct> <fct>   <fct>   <fct>   <fct>
#> 1 A     Travail Travail sante   sante
#> 2 B     Travail Travail Travail sante


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

Fabrice Yaméogo
Messages : 24
Enregistré le : 22 Mar 2019, 10:09

Re: extraire des données d'un data frame

Messagepar Fabrice Yaméogo » 30 Juil 2019, 11:51

Bonjour,
merci pour l'astuce.
Cordialement

Serge Rapenne
Messages : 1426
Enregistré le : 20 Aoû 2007, 15:17
Contact :

Re: extraire des données d'un data frame

Messagepar Serge Rapenne » 30 Juil 2019, 12:10

Bonjour,

j'étais partis sur une autre voie :

Code : Tout sélectionner

library(dplyr)
library(tidyr)
df %>% gather(X,Exist,-id,-motifs) %>% filter(Exist=="True") %>% select(-Exist) %>% spread(X,motifs)
id     x_1     x_2     x_3   x_4
1  A Travail Travail   sante sante
2  B Travail Travail Travail sante


Serge

François Bonnot
Messages : 537
Enregistré le : 10 Nov 2004, 15:19
Contact :

Re: extraire des données d'un data frame

Messagepar François Bonnot » 31 Juil 2019, 07:52

Bonjour,
Autre solution sans dplyr :

Code : Tout sélectionner

data.frame(id=rle(as.character(df$id))$values,sapply(df[2:5],function(x) df$motifs[as.logical(x)]))
François


Retourner vers « Questions en cours »

Qui est en ligne

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

cron