Compter le nombre de cas valide par variable

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

Alexandre Pollien
Messages : 2
Enregistré le : 29 Fév 2020, 00:12

Compter le nombre de cas valide par variable

Messagepar Alexandre Pollien » 06 Juil 2021, 22:55

Bonjour.

Pauvre débutant, je suis bloqué sur un problème que je n'arrive pas à résoudre malgré je ne sais combien d'heure de recherche un peu partout.

Je voudrais juste compter le nombre de cas valides de toutes les variables de ma base de donnée, et créer un vecteur avec le N par variable.
J'ai la réponse invariable "Erreur dans `[.data.frame`(df, , x) : colonnes non définies sélectionnées". J'ai trouvé des moyens d'éviter l'erreur, mais cela ne compte plus juste, donc je vous montre ce qui devrait fonctionner selon mes pauvres compétences:

df <- data.frame(
c0 = c(1,2,3,4),
c1 = c(1,3,1,4),
c2 = c(3,4,0,1),
c3 = c(1,2,12,0))

comptage <- function(x) {length(df[,x][!is.na(df[,x])])}
nbcases<- as.vector(sapply(df[,1:4],comptage))
nbcases


J'aimerais bien garder une logique similaire car je voudrais aussi calculer le nombre de modalités, de la façon suivante:
nmodal <- function(x) {length(unique(CSData[,x]))}

Merci du fond du coeur pour toute réponse. Là je ne sais plus où chercher.

Alex

Eric Casellas
Messages : 767
Enregistré le : 06 Jan 2009, 14:59

Re: Compter le nombre de cas valide par variable

Messagepar Eric Casellas » 07 Juil 2021, 07:51

Bonjour,

A priori de ce que j'en comprend dans ta fonction comptage le paramètre d'entrée x correspond à l'indice d'une colonne de ton objet df, or quand tu l'utilise via la fonction sapply tu lui donne le contenu des colonnes à la place de leurs indices. Si c'est bien ça alors il te faut plutôt lui donner la liste des indices de colonnes que tu veux:

Code : Tout sélectionner

sapply(1:ncol(df[,1:4]),comptage)

ou

Code : Tout sélectionner

sapply(1:ncol(df),comptage)


PS: dans l'exemple que tu as fournis il se trouve qu'il n'y a pas de NA et que le nombre de lignes et de colonnes et identique ce qui peut rendre difficile de vérifier que les codes marchent ou pas...

Eric
Eric

Alexandre Pollien
Messages : 2
Enregistré le : 29 Fév 2020, 00:12

Re: Compter le nombre de cas valide par variable

Messagepar Alexandre Pollien » 07 Juil 2021, 08:10

Merci, c'est génial! ça fonctionne et en plus je crois que j'ai compris le problème.
Alors effectivement, mon exemple a été monté rapidement pour la réplication. Mais sur le vrai dataframe, cela compte correctement!

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

Re: Compter le nombre de cas valide par variable

Messagepar Michaël Delorme » 07 Juil 2021, 08:17

Ou avec une autre méthode :

Code : Tout sélectionner

library(dplyr)
df <- data.frame(
  c0 = c(1,2,3,4),
  c1 = c(1,3,1,4),
  c2 = c(3,NA,NA,NA),
  c3 = c(1,2,12,0))

df %>%
  summarise(across(everything(), ~ sum(!is.na(.))))

df %>%
  summarise(across(everything(), n_distinct))

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

Re: Compter le nombre de cas valide par variable

Messagepar Mickael Canouil » 07 Juil 2021, 08:53

Bonjour,

on peut faire beaucoup plus simple (et performant).

Code : Tout sélectionner

df <- data.frame(
  c0 = c(1,2,3,4),
  c1 = c(1,3,1,4),
  c2 = c(3,NA,NA,NA),
  c3 = c(1,2,12,0)
)
colSums(!is.na(df))
#> c0 c1 c2 c3 
#>  4  4  1  4           

Et pour avoir le nombre de valeurs uniques non NA
  • R Base

    Code : Tout sélectionner

    sapply(df, function(x) length(unique(na.exclude(x))))
    #> c0 c1 c2 c3 
    #>  4  3  1  4         
  • Tidyverse

    Code : Tout sélectionner

    library("dplyr")
    sapply(df, n_distinct, na.rm = TRUE)
    #> c0 c1 c2 c3 
    #>  4  3  1  4         
  • data.table

    Code : Tout sélectionner

    library("data.table")
    sapply(df, uniqueN, na.rm = TRUE)
    #> c0 c1 c2 c3 
    #>  4  3  1  4         
Image

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


Retourner vers « Questions en cours »

Qui est en ligne

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