填充矩阵,R中的组数据之间的平均差异

时间:2018-06-06 00:40:20

标签: r matrix algebra

我希望获得数据帧的列之间差异的平均绝对值(即1.从另一列中减去一列中的值,2。取这些差异的绝对值,然后3.取均值那些绝对值)。然后我想要填充一个矩阵,其结果是将每列与每个其他列进行比较。

例如:我有一个看起来像这样的数据框

 df <- data.frame(m1=1:3, m2=1:3+1, m3=1:3+2)

我希望得到一个这样的矩阵(例如,第2列,第1行填充结果:

mean(abs(m2-m1))

看起来像这样:

       m1  m2  m3
    m1  0   1   2
    m2  1   0   1
    m3  2   1   0

2 个答案:

答案 0 :(得分:1)

尝试使用diag

abs(df-diag(as.matrix(df)))
#   m1 m2 m3
# 1  0  1  2
# 2  1  0  1
# 3  2  1  0

答案 1 :(得分:1)

使用base r:

由于我们采用绝对值,因此结果将始终是对称矩阵:

首先(1)得到列的绝对差值的平均值,(2)得到组合,(3)创建维数矩阵:ncol(df)* ncol(df)和(4)填写结果:

a=combn(df,2,function(x)mean(abs(do.call("-",x))))#1

b= t(combn(ncol(df),2)) #(2)

d = matrix(0,ncol(df),ncol(df))#(3)

d[b]=a
d+t(d)
   [,1] [,2] [,3]
[1,]    0    1    2
[2,]    1    0    1
[3,]    2    1    0

你可以写一个长行代码:

  replace(matrix(0,ncol(df),ncol(df)),rbind(i<-t(combn(ncol(df),2)),i[,2:1]),rep(combn(df,2,function(x)mean(abs(do.call("-",x)))),2))
     [,1] [,2] [,3]
[1,]    0    1    2
[2,]    1    0    1
[3,]    2    1    0