两两差异的交叉表

问题描述 投票:0回答:3

假设我有一个数据框,其中有 2 个变量,对应于为不同组 A、B 和 C 计算的 2 个索引。所以数据框本质上是:

 >df
   Group      v.1      v.2
     A         2        3
     B         4        4
     C         7        9

我想计算每个变量的成对差异(

v.1
v.2
),然后以交叉表格式绘制结果,因此对角线下方的值给出了
v.1
中的成对差异上对角线是
v.2
中的成对差异值。所以结果看起来像:

        A       B       C 
   A    0       1       6
   B    2       0       5
   C    5       3       0

有什么软件包可以帮助我实现这一目标吗?任何建议都将受到欢迎。

r
3个回答
5
投票

您可以将

combn
+
diff
upper.tri
lower.tri
一起使用,如下所示:

m <- matrix(0, nrow = nrow(df), ncol = nrow(df), 
            dimnames=list(df$Group, df$Group))
m
#   A B C
# A 0 0 0
# B 0 0 0
# C 0 0 0

m[lower.tri(m)] <- combn(df$v.1, 2, FUN=diff)
m[upper.tri(m)] <- combn(df$v.2, 2, FUN=diff)
m
#   A B C
# A 0 1 6
# B 2 0 5
# C 5 3 0

0
投票

不如 @A5C1D2H2I1M1N2O1R2T1 的解决方案那么顺利,但也可以使用 R

outer
包中的
base
函数来解决这个问题:

df <- read.table(text =
                   "Group      v.1      v.2
                      A         2        3
                      B         4        4
                      C         7        9",
                 header = TRUE)

# matrix of pairwise differences for v.1
mat_dif1 <- outer(X = df$v.1, Y = df$v.1, FUN = "-")
mat_dif1[mat_dif1<0] <- 0

# matrix of pairwise differences for v.2
mat_dif2 <- outer(X = df$v.2, Y = df$v.2, FUN = "-")
mat_dif2[mat_dif2>0] <- 0

mat_dif1 + abs(mat_dif2)

##      [,1] [,2] [,3]
## [1,]    0    1    6
## [2,]    2    0    5
## [3,]    5    3    0

如果您需要行名称和列名称,则:

results <- mat_dif1 + abs(mat_dif2)
dimnames(results) <- list(df$Group, df$Group)
results
##   A B C
## A 0 1 6
## B 2 0 5
## C 5 3 0

0
投票

由于 upper.tri 作业中的索引顺序,@A5C1D2H2I1M1N2O1R2T1 的

 答案并不完全正确。
@Valentin_Stefan
的答案是,使用外积。 仅当使用四个元素时您才会看到这一点。 df <- data.frame(list( "Group" = c("A", "B", "C", "D"), "v.1" = c( 1, 1, 1, 3 ), "v.2" = c( 1, 1, 1, 2 ) )) m <- matrix(0, nrow = nrow(df), ncol = nrow(df), dimnames=list(df$Group, df$Group)) m[lower.tri(m)] <- combn(df$v.1, 2, FUN=diff) m[upper.tri(m)] <- combn(df$v.2, 2, FUN=diff) m # A B C D # A 0 0 0 0 # B 0 0 1 1 # C 0 0 0 1 # D 2 2 2 0

(请参阅应位于 
m[2,3]

m[1,4]
元素)
我会

转置为正确的

;也许有更简单的方法? n <- matrix(0, nrow = nrow(df), ncol = nrow(df), dimnames=list(df$Group, df$Group)) n[lower.tri(n)] <- combn(df$v.2, 2, FUN=diff) n <- t(n) n[lower.tri(n)] <- combn(df$v.1, 2, FUN=diff)

	
© www.soinside.com 2019 - 2024. All rights reserved.