0

在我的研究中,每个受试者都被问到 n*(n-1)/2 个问题,关于他对 n=5 个对象之间的差异的主观看法(以后用于 3 向多维缩放)。

我想从 10 项向量 v 创建一个相异矩阵,例如按以下方式排列(对于 n = 5):

  1
  2 5
  3 6 8
  4 7 9 10

这是一个代码示例代码,用于为这个特定的 n 实现它:

dissim<-rep(0,n*n)
dim(dissim)<-c(5,5)
dissim[2,1]<-v[1]
dissim[3,1]<-v[2]
dissim[4,1]<-v[3]
dissim[5,1]<-v[4]
dissim[3,2]<-v[5]
dissim[4,2]<-v[6]
dissim[5,2]<-v[7]
dissim[4,3]<-v[8]
dissim[5,3]<-v[9]
dissim[5,4]<-v[10]

是否有任何实用函数可以帮助对任何 n 执行此操作?我知道我可以使用两个嵌套循环来做到这一点,但如果我使用专用函数,代码会更清晰。

也许我会在这个过程中了解另一个有用的库的存在?

4

2 回答 2

3
n <- 5
mat <- matrix(0, ncol = n, nrow = n)
mat[lower.tri(mat)] <- 1:10
mat
     [,1] [,2] [,3] [,4] [,5]
[1,]    0    0    0    0    0
[2,]    1    0    0    0    0
[3,]    2    5    0    0    0
[4,]    3    6    8    0    0
[5,]    4    7    9   10    0
于 2012-07-15T11:43:07.860 回答
0

呃......偶然我自己找到了解决方案。碰巧, dist 对象的内部结构就是向量 v。所以有效的是:

dissim<-v
class(dissim)='dist'
attr(dissim,"Size")<-5
dissim<-as.dist(dissim)

它现在有效,但我不确定这是否是一种记录方式并且将始终有效。

于 2012-07-15T11:45:14.167 回答