假设我有一个数据帧,其中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
是否有任何包可以帮助我实现这一目标?任何建议都会受到欢迎。
答案 0 :(得分: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
答案 1 :(得分: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