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

用R中组数据之间的平均差异填充矩阵,r,matrix,algebra,R,Matrix,Algebra,我希望得到数据帧各列之间差异的平均绝对值(即1.从一列中减去另一列中的值,2.取这些差异的绝对值,然后3.取这些绝对值的平均值)。然后,我希望用结果填充一个矩阵,将每一列与其他每一列进行比较 例如:我有一个数据框,看起来像这样 df <- data.frame(m1=1:3, m2=1:3+1, m3=1:3+2) 看起来是这样的: m1 m2 m3 m1 0 1 2 m2 1 0 1 m3 2 1 0 尝试使用

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

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

 df <- data.frame(m1=1:3, m2=1:3+1, m3=1:3+2)
看起来是这样的:

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

尝试使用
diag

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

尝试使用
diag

abs(df-diag(as.matrix(df)))
#   m1 m2 m3
# 1  0  1  2
# 2  1  0  1
# 3  2  1  0
使用基本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
用基数r替换(矩阵(0,ncol(df),ncol(df)),rbind(i

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

首先(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

replace(矩阵(0,ncol(df),ncol(df)),rbind(感谢您花时间回答@CPak!不幸的是,您的解决方案没有为我的数据集提供预期的结果。我的数据集的行数比列数多。也就是说,如果原始数据框如下所示,您的解决方案是否有效:
df感谢您花时间回答@CPak!不幸的是,您的解决方案没有提供e我的数据集的预期结果。我的数据集的行数比列数多。也就是说,如果原始数据框如下所示,您的解决方案是否有效:
df