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

ある種の相関行列を取得する形式では、最初の2つの列がインジケーターとして表示され、評価は値です。

   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の関数を知っている人はいますか?

4

3 に答える 3

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
于 2012-12-29T18:54:24.317 に答える
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 のソリューションほどエレガントではありませんが、行の順序に依存せず、すべての組み合わせが存在する必要もありません。

于 2012-12-29T18:25:21.760 に答える
1

これが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

これは、質問のように行が並べられている場合にのみ機能します。

于 2012-12-29T18:14:29.037 に答える