转换数据集(相似度)

时间:2012-12-29 17:49:46

标签: r database-design

我想转换以下数据格式(简化表示):

  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

你们中有人知道R中的一个函数吗?

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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的解决方案那么优雅,但它不依赖于行的顺序,也不需要存在所有组合。

答案 2 :(得分: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

只有在问题中对行进行排序时才有效。