2017-08-22 5 views
0

Comment puis-je trouver la meilleure ressemblance entre une ligne particulière et le reste des lignes d'une trame de données?Comment trouver la meilleure ressemblance entre une ligne et le reste de l'ensemble de données dans R?

J'essaie d'expliquer ce que je veux dire. Jetez un oeil à ce dataframe:

df <- structure(list(person = 1:5, var1 = c(1L, 5L, 2L, 2L, 5L), var2 = c(4L, 
4L, 3L, 2L, 2L), var3 = c(5L, 4L, 4L, 3L, 1L)), .Names = c("person", 
"var1", "var2", "var3"), class = "data.frame", row.names = c(NA, 
-5L)) 

Comment puis-je trouver la meilleure ressemblance entre 1 personne (ligne 1) et le reste des lignes (personnes) dans le cadre de données. La sortie devrait être quelque chose comme: personne 1 toujours dans la rangée 1 et le reste des rangées dans l'ordre de la meilleure ressemblance. L'algorithme de simmilarité que je veux utiliser est cosinus ou pearson. J'ai essayé de résoudre mon problème avec les fonctions du arules package, mais cela ne correspondait pas bien à mes besoins.

Des idées pour quelqu'un?

Répondre

2

Une autre idée est de définir la fonction cosinus manuellement, et l'appliquer sur votre trame de données, à savoir

f1 <- function(x, y){ 
    crossprod(x, y)/sqrt(crossprod(x) * crossprod(y)) 
} 

df[c(1, order(sapply(2:nrow(df), function(i) 
           f1(unlist(df[1,-1]), unlist(df[i, -1]))), 
                  decreasing = TRUE)+1),] 

qui donne,

person var1 var2 var3 
1  1 1 4 5 
3  3 2 3 4 
4  4 2 2 3 
2  2 5 4 4 
5  5 5 2 1 
+1

Merci! belle approche – rdatasculptor

2

Vous pouvez essayer de cosinelsa:

library('lsa') 
cosine(t(df[-1])) 
#   [,1]  [,2]  [,3]  [,4]  [,5] 
#[1,] 1.0000000 0.8379571 0.9742160 0.9356015 0.5070926 
#[2,] 0.8379571 1.0000000 0.9346460 0.9637388 0.8947540 
#[3,] 0.9742160 0.9346460 1.0000000 0.9908302 0.6780635 
#[4,] 0.9356015 0.9637388 0.9908302 1.0000000 0.7527727 
#[5,] 0.5070926 0.8947540 0.6780635 0.7527727 1.0000000 

vous fournir cosine avec une matrice où chaque colonne représente une personne (c'est pourquoi j'utilise t) et il calcule toutes les similitudes cosinus entre eux.

+0

Merci pour le conseil! Je vais essayer ça. La sortie n'est pas tout à fait ce que je voulais, parce que je veux récupérer le même dataframe avec un ordre différent. – rdatasculptor

+0

Et je n'ai pas besoin de toutes les similitudes entre toutes les lignes. Donc, lsa: le cosinus est trop caculé. – rdatasculptor

+0

La fonction crée toutes les combinaisons de manière standard. Vous pouvez utiliser cette sortie pour reformater les résultats dans votre fichier data.fr original. – LyzandeR