Filtrer les données d'une datatable

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

Isabelle Berquand
Messages : 3
Enregistré le : 21 Juin 2022, 04:14

Filtrer les données d'une datatable

Messagepar Isabelle Berquand » 22 Juil 2022, 13:24

Bonjour,

En Rmarkdown, j'ai récupéré des données à partir d'un fichier à plat
Voici en exemple 4 lignes du fichier récupéré au départ :
Image

Puis j'ai calculé la valeur maximale des champs 4 et 5 pour les lignes regroupées
et ajouté 2 colonnes : 1 colonne commentaires (vide) et une colonne calculée (somme du maximum des champs 4 et 5)

donnees <- fichier$fichier %>%
group_by (champ1,champ2,champ3) %>%
summarise(nb = n(), max_Ch4 = max(Champ4), max_Ch5 = max(Champ5)) %>%
mutate(commentaire="", dep=as.numeric(max_Ch4)+as.numeric(max_Ch5)) %>%
ungroup

J'obtiens alors ceci
Image

J'affiche le tableau ainsi (je souhaite pouvoir éditer la partie commentaire pour la filtrer ensuite) :
datatable(donnees, rownames = FALSE, filter = list(position = 'top', clear = TRUE, plain = TRUE), options = list(dom = 'ltp', pageLength = 20, autoWidth = TRUE, order = list(c(0 , 'asc'))), editable = TRUE)

Mais lors de l'affichage, la colonne commentaire est éditable mais pas filtrable
Image

Auriez-vous une explication ?

Avec mes remerciements

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

Re: Filtrer les données d'une datatable

Messagepar Mickael Canouil » 22 Juil 2022, 16:02

Bonjour,

pourriez-vous formater votre message avec les balises de code et avec un extrait de votre jeux de données pour que ce soit reproductible ?


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

Isabelle Berquand
Messages : 3
Enregistré le : 21 Juin 2022, 04:14

Re: Filtrer les données d'une datatable

Messagepar Isabelle Berquand » 22 Juil 2022, 17:44

Voici les éléments plus précis, en espérant que cela répondra à votre demande (désolée ce sont mes premiers pas sur ce forum) :

Pour des raisons de confidentialité des données, j'ai créé un jeu de données très partiel et un peu corrigé dans un fichier csv
Voici mon jeu de données :

Code : Tout sélectionner

         Num  Lieu Code  Champ4 Champ5
       <dbl> <dbl> <chr>  <dbl>  <dbl>
 1 191096167   801 G2         3      4
 2 191096167   801 G2         1      2
 3 191096178   800 S4         4      2
 4 191096178   800 S4         2      2
 5 191096178   800 S1         4      3
 6 191096189   800 R5         3      2
 7 191096189   800 Z1         3      2
 8 191096190   800 M4         2      3
 9 191096190   800 M4         3      1
10 191096203   800 Z7         4      4


dont le contenu est :

Code : Tout sélectionner

structure(list(Num = c(191096167, 191096167, 191096178, 191096178,
191096178, 191096189, 191096189, 191096190, 191096190, 191096203
), Lieu = c(801, 801, 800, 800, 800, 800, 800, 800, 800, 800),
    Code = c("G2", "G2", "S4", "S4", "S1", "R5", "Z1", "M4",
    "M4", "Z7"), Champ4 = c(3, 1, 4, 2, 4, 3, 3, 2, 3, 4), Champ5 = c(4,
    2, 2, 2, 3, 2, 2, 3, 1, 4)), row.names = c(NA, -10L), spec = structure(list(
    cols = list(Num = structure(list(), class = c("collector_double",
    "collector")), Lieu = structure(list(), class = c("collector_double",
    "collector")), Code = structure(list(), class = c("collector_character",
    "collector")), Champ4 = structure(list(), class = c("collector_double",
    "collector")), Champ5 = structure(list(), class = c("collector_double",
    "collector"))), default = structure(list(), class = c("collector_guess",
    "collector")), delim = ";"), class = "col_spec"), problems = <pointer: 0x0000008708f358e0>, class = c("spec_tbl_df",
"tbl_df", "tbl", "data.frame"))


Voici le code écrit dans un fichier rmarkdown :

Code : Tout sélectionner

---
title: "Suivi codage ssr"
output: html_document
---

```{r setup, include=FALSE}
knitr::opts_chunk$set(echo=FALSE, message=FALSE, warning=FALSE, paged.print=FALSE)
```

## R Markdown

```{r initialisation}
# library

library(tidyverse)
library(DT)

# Lecture fichier rhs

fichier <- read_csv2(file='rh.csv')

# Analyse des résultats

## Cree la table à analyser

donnees <- fichier %>%
  group_by (Num,Lieu,Code) %>%
  summarise(nb = n(), max_Ch4 = max(Champ4), max_Ch5 = max(Champ5))%>%
  mutate(commentaire="", dep=as.numeric(max_Ch4)+as.numeric(max_Ch5)) %>%
  ungroup

```

# Donnees a analyser

```{r}
datatable(donnees, rownames = FALSE, filter = list(position = 'top', clear = TRUE, plain = TRUE), options = list(dom = 'ltp', pageLength = 20, autoWidth = TRUE, order = list(c(0 , 'asc'))), editable = TRUE)
```


Le résultat me fournit un tableau filtrable et éditable, sauf pour la colonne "commentaires" qui n'est pas filtrable.

Auriez vous une explication ?

Merci

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

Re: Filtrer les données d'une datatable

Messagepar Mickael Canouil » 23 Juil 2022, 16:46

Votre colonne commentaire n'est pas variable puisque vous lui affectez "".
De ce fait, il n'y a rien à filter ou trier dans cette colonne.
Mickaël
mickael.canouil.fr | rlille.fr

Isabelle Berquand
Messages : 3
Enregistré le : 21 Juin 2022, 04:14

Re: Filtrer les données d'une datatable

Messagepar Isabelle Berquand » 23 Juil 2022, 18:19

Merci pour votre réponse.

Du coup j'ai trouvé une solution pas très élégante mais qui fonctionne visuellement

Code : Tout sélectionner

donnees <- fichier %>%
  group_by (Num,Lieu,Code) %>%
  summarise(nb = n(), max_Ch4 = max(Champ4), max_Ch5 = max(Champ5))%>%
  mutate(commentaire=case_when(max_Ch4==4 ~ " ",
                                (max_Ch4!=4) ~ ""),
         dep=as.numeric(max_Ch4)+as.numeric(max_Ch5)) %>%
  ungroup

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

Re: Filtrer les données d'une datatable

Messagepar Mickael Canouil » 24 Juil 2022, 15:29

Je ne comprend pas l'intérêt de générer une colonne non variable et vouloir pouvoir absolument trier/filtrer cette colonne ...

Datatable (jQuery) est malin, s'il y a quelqu'un chose à filtrer il le permet, sinon non.
L'utilisateur•trice est ainsi au courant qu'il n'y a une seule et unique valeur dans la colonne dès le départ.
Mickaël
mickael.canouil.fr | rlille.fr

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

Re: Filtrer les données d'une datatable

Messagepar Pierre-Yves Berrard » 24 Juil 2022, 20:55

Parce que la colonne en question est éditable ?
PY

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

Re: Filtrer les données d'une datatable

Messagepar Mickael Canouil » 25 Juil 2022, 14:06

Mais dans ce cas, si la colonne est édité, le filtre devient accessible puisqu'il y a des choses à filtrer/trier, mais à la condition que la table soit mise à jour correctement (fonction DT::replaceData).
Voir les exemples dans dans la documentation lié à shiny : https://rstudio.github.io/DT/shiny.html
En bas il y a les exemples de l'utilisation de l'option d'édition: https://yihui.shinyapps.io/DT-edit/
Mickaël
mickael.canouil.fr | rlille.fr


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Google [Bot] et 1 invité