2 votes

obtenir les top_n lignes les plus proches de la première ligne d'un bloc de données

J'ai pensé demander aux experts - désolé, c'est plus une question de revue de code, mais je la complète ci-dessous. Le code suivant est-il correct pour obtenir les top_n cas les plus proches de la première ligne - en ignorant la première ligne :

example_df <- data.frame(
                  gender = c("male", "male", "female", "male")
                , age = c(30, 30.1, 20, 31)
              )
example_df

gower_dist <- as.matrix(daisy(example_df, metric = "gower"))
gower_dist

top_n <- 2

# select top 2 closest row indices of row 1
example_df[head(order(gower_dist[-1, 1]), top_n) + 1,]

J'ai essayé de faire fonctionner ce système pour la troisième rangée également, mais cela ne fonctionne pas :

example_df[head(order(gower_dist[-3, 3]), top_n) + 1,]

Tout retour d'information serait très apprécié. Merci de votre compréhension.

PS :

la métrique de la distance :

            1           2         3          4
1 0.000000000 0.004545455 0.9545455 0.04545455
2 0.004545455 0.000000000 0.9590909 0.04090909
3 0.954545455 0.959090909 0.0000000 1.00000000
4 0.045454545 0.040909091 1.0000000 0.00000000

4voto

GKi Points 6744

Régler le diag a NA facilitera l'établissement de sous-ensembles.

diag(gower_dist)  <- NA
example_df[head(order(gower_dist[, 1]), top_n),]
#  gender  age
#2   male 30.1
#4   male 31.0

example_df[head(order(gower_dist[, 3]), top_n),]
#  gender  age
#1   male 30.0
#2   male 30.1

Vous supprimez la colonne 3 avec gower_dist[-3, 3] mais order vous donne toujours des valeurs de 1 à 3 et non pas 1,2 et 4.

2voto

RyanD Points 6857

En utilisant la suggestion de @GKi de mettre les éléments diagonaux de la matrice de distance à NA,

diag(gower_dist)  <- NA

nous pouvons également utiliser dplyr::top_n

library(dplyr)

n <- 2
row <- 3

example_df %>% 
  top_n(n, -gower_dist[, row])

#   gender  age
# 1   male 30.0
# 2   male 30.1

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X