2017-08-22 43 views
0

如何找到某個特定行與數據框中其餘行之間的最佳相似性?如何在R中找到1行與其餘數據框之間的最佳相似性?

我試着解釋我的意思。看看這個數據幀:

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)) 

如何找到在數據幀人1(第1行)和行(人)的其餘部分之間的最佳相似。輸出應該是這樣的:人1仍然在第1行,其餘的行按照最相似的順序排列。我想使用的相似度算法是餘弦或皮爾森。我試圖用arules package的函數來解決我的問題,但它與我的需求不匹配。

任何想法的人?

回答

2

另一個想法是手動定義餘弦函數,並把它的數據幀,即

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),] 

賦予,

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

謝謝!不錯的方法 – rdatasculptor

2

你可以嘗試從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 

您提供cosine與其中每列代表一個人的矩陣(這就是爲什麼我使用t),並計算出它們之間所有的餘弦相似性。

+0

謝謝你的提示!我會試試這個。輸出結果不是我想要的,因爲我想用不同的行順序返回相同的數據幀。 – rdatasculptor

+0

而且我不需要所有行之間的所有相似性。所以lsa:餘弦計算方式太多了。 – rdatasculptor

+0

該函數以標準方式創建所有組合。您可以使用此輸出將格式化結果回原始數據幀。 – LyzandeR

相關問題