/ / détermination du pourcentage de réponses identiques pour plusieurs variables - r, base de données, analyse, data-science

déterminer le pourcentage de réponses identiques pour plusieurs variables - r, base de données, analyse, data-science

J'ai un jeu de données avec de nombreuses variables, y compris26 variables, toutes avec des valeurs allant de 1 à 12. Je souhaite supprimer toutes les lignes contenant au moins 80% des valeurs identiques (plus de 21 1 ", ou plus de 21 2", etc.). J’ai du mal à trouver un moyen de faire cela dans R, et j’apprécierais vraiment quelques idées pour aborder ce problème!

quand je lance le

out <- df1[apply(df1, 1, function(x) mean(x == Mode(x)) <= 0.8),]

code sur le sous-ensemble de variables d'un groupe, les valeurs des variables de l'autre groupe deviennent toutes NA

Voici 60 lignes de l'ensemble de données avec 5 questions des trois conditions incluses: https://nofile.io/f/gBWymjYmQ2O/dataset

Mon résultat attendu est df1 (qui a plus de 100 variables) avec les lignes contenant plus de 80% de réponses identiques aux 26 variables d'intérêt supprimées.

Réponses:

1 pour la réponse № 1

Nous pouvons parcourir les lignes du jeu de données, obtenir la fréquence des valeurs, vérifier si la valeur la plus fréquente n'est pas supérieure à 80% pour créer une logique. vector et supprimer les lignes en fonction de cela

Mode <- function(x) {
ux <- unique(x)
ux[which.max(tabulate(match(x, ux)))]
}

out <- df1[apply(df1, 1, function(x)  mean(x == Mode(x)) <= 0.8),]

Mettre à jour

Sur la base du jeu de données du PO, il y a des NA dans les lignes et certaines lignes ont toutes des NA. Nous pouvons modifier le code pour supprimer les lignes contenant toutes les NA et celles ayant 80% de valeurs identiques

Mode <- function(x) {
ux <- unique(x[!is.na(x)])
ux[which.max(tabulate(match(x, ux)))]
}

df1[ apply(df1, 1, function(x)  mean(x == Mode(x), na.rm = TRUE) <= 0.8 & !all(is.na(x))),]

Les données

set.seed(24)
df1 <- as.data.frame(matrix(sample(1:12, 26 *20, replace = TRUE), ncol = 26))
df1[c(1, 3, 7),1:21] <- 5