2012-12-29 70 views
2

我要變換的以下數據格式(簡化表示):轉化數據集(相似性評級)

image1 image2 rating 
1  1  2  6 
2  1  3  5 
3  1  4  7 
4  2  3  3 
5  2  4  5 
6  3  4  1 

被轉載:

structure(list(image1 = c(1, 1, 1, 2, 2, 3), image2 = c(2, 3, 
4, 3, 4, 4), rating = c(6, 5, 7, 3, 5, 1)), .Names = c("image1", 
"image2", "rating"), row.names = c(NA, -6L), class = "data.frame") 

要你在哪裏得到某種相關矩陣的格式,其中前兩列作爲指標,額定值爲:

1 2 3 4 
1 NA 6 5 7 
2 6 NA 3 5 
3 5 3 NA 1 
4 7 5 1 NA 

Doe你有沒有知道R中的一個函數來做到這一點?

回答

3

我不喜歡<<-運營商非常多,但它適用於這個(命名您的結構s):

N <- max(s[,1:2]) 
m <- matrix(NA, nrow=N, ncol=N) 
apply(s, 1, function(x) { m[x[1], x[2]] <<- m[x[2], x[1]] <<- x[3]}) 

> m 
    [,1] [,2] [,3] [,4] 
[1,] NA 6 5 7 
[2,] 6 NA 3 5 
[3,] 5 3 NA 1 
[4,] 7 5 1 NA 

不一樣優雅的Karsten的解決方案,但它不依賴的順序行,也不要求所有組合都存在。

1

這是一種方法,其中dat是在問題

res <- matrix(0, nrow=4, ncol=4) # dim may need to be adjusted 
ll <- lower.tri(res, diag=FALSE) 
res[which(ll)] <- dat$rating 
res <- res + t(res) 
diag(res) <- NA 

這隻有行排序作爲問題定義的數據幀。

+0

如果每個組合被稱爲是本正好一次,但行的順序不正確,該解決方案可以應用於'DAT [順序(數據[ ,1],DAT [1,2]),]'。 –

4

我寧願使用矩陣索引:

N <- max(dat[c("image1", "image2")]) 
out <- matrix(NA, N, N) 
out[cbind(dat$image1, dat$image2)] <- dat$rating 
out[cbind(dat$image2, dat$image1)] <- dat$rating 

#  [,1] [,2] [,3] [,4] 
# [1,] NA 6 5 7 
# [2,] 6 NA 3 5 
# [3,] 5 3 NA 1 
# [4,] 7 5 1 NA 
+0

正確的做法。 –