R 成对差异交叉表

R 成对差异交叉表,r,R,假设我有一个数据框,其中有两个变量,对应于为不同组a、B和C计算的两个指数。因此,数据帧本质上是: >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计算的两个指数。因此,数据帧本质上是:

 >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

是否有任何方案可以帮助我实现这一目标?欢迎提出任何建议

您可能可以使用
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

m您可能可以使用
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

m不像@A5C1D2H2I1M1N2O1R2T1的解决方案那样平滑,但也可以使用R
base
包中的
outer
函数来实现这一点:

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

df不像@A5C1D2H2I1M1N2O1R2T1的解决方案那样平滑,但也可以使用R
base
包中的
outer
函数来实现这一点:

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
df