2
votes

Comment calculer le pourcentage d'entités sans zéro dans toutes les colonnes de R?

J'ai un dataframe avec la première colonne comme features et d'autres colonnes avec des valeurs dans l'ensemble {0,1,2, -1, -2}.

Voici la structure du dataframe.

df <- structure(list(Features = structure(c(1L, 11L, 12L, 13L, 14L, 
15L, 16L, 17L, 18L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L), .Label = c("Var1", 
"Var10", "Var11", "Var12", "Var13", "Var14", "Var15", "Var16", 
"Var17", "Var18", "Var2", "Var3", "Var4", "Var5", "Var6", "Var7", 
"Var8", "Var9"), class = "factor"), Column1 = c(0L, 0L, 0L, 0L, 
0L, 0L, 1L, 1L, 1L, 1L, 1L, 0L, 0L, -1L, -1L, -1L, 0L, 0L), Column2 = c(0L, 
0L, 0L, 1L, 1L, 1L, 1L, 0L, 0L, 0L, 0L, -2L, -2L, -2L, -2L, -2L, 
0L, 0L), Column3 = c(0L, 0L, 0L, 0L, 2L, 2L, 2L, 2L, 2L, 2L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L), Column4 = c(0L, 0L, 0L, 2L, 
2L, 2L, 2L, 0L, 0L, 0L, 0L, 0L, -2L, -2L, -2L, -2L, 0L, 0L), 
    Column5 = c(0L, 0L, 0L, 0L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
    1L, 0L, 0L, 0L, 0L, 0L), Column6 = c(0L, 0L, 0L, 2L, 2L, 
    2L, 0L, 0L, -1L, -1L, -1L, -1L, -1L, -1L, 0L, 0L, 0L, 0L), 
    Column7 = c(-1L, -1L, 2L, 2L, 2L, 2L, 2L, 2L, -1L, -1L, -1L, 
    -1L, -1L, -1L, -1L, -1L, -1L, -1L), Column8 = c(1L, 1L, 1L, 
    1L, 0L, 0L, 0L, 0L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 1L, 1L, 1L
    )), class = "data.frame", row.names = c(NA, -18L))

Pour chaque colonne, je voulais calculer le pourcentage de fonctionnalités sans 0 dans les colonnes.

Toute aide est appréciée. Merci beaucoup.


3 commentaires

Pouvez-vous montrer la sortie attendue pour l'exemple


Voulez-vous savoir quelles lignes n'ont pas de zéro dans toutes les colonnes?


@Cettt Pour chaque colonne, je veux connaître le pourcentage de fonctionnalités qui n'ont pas de 0 dans les colonnes.


3 Réponses :


2
votes

Peut-être que quelque chose comme ce qui suit fera ce que vous voulez.
df [-1]! = 0 renvoie une matrice logique, ses colSums sont le nombre d'entrées non nulles dans chaque colonne. Divisez par le nombre de lignes et multipliez par 100 pour obtenir le pourcentage souhaité.

100*colSums(df[-1] != 0)/nrow(df)
# Column1   Column2   Column3   Column4   Column5 
# 44.44444  50.00000  33.33333  44.44444  50.00000 
#  Column6   Column7   Column8 
# 50.00000 100.00000  77.77778


0 commentaires

1
votes

Nous pouvons utiliser colSums et diviser par nombre de lignes dans le dataframe

library(dplyr)
df %>%  summarise_at(-1, ~sum(.!= 0)/n())

Ou en utilisant dplyr p >

colSums(df[-1] != 0)/nrow(df)

#Column1 Column2 Column3 Column4 Column5 Column6 Column7 Column8 
#  0.444   0.500   0.333   0.444   0.500   0.500   1.000   0.778 


2 commentaires

Merci beaucoup. Qu'est-ce que -1 ici?


@beginner Il s'agit d'ignorer la 1ère colonne ici car vous ne voulez pas la calculer pour la colonne Features .



2
votes

Nous pouvons simplement utiliser colMeans sur une matrix

library(tidyverse)
map_dbl(df[-1], ~ mean(.x != 0))

Ou utiliser tidyverse

colMeans(df[-1] != 0)
#    Column1   Column2   Column3   Column4   Column5   Column6   Column7   Column8 
# 0.4444444 0.5000000 0.3333333 0.4444444 0.5000000 0.5000000 1.0000000 0.7777778 


0 commentaires