首页 > 解决方案 > R中两个相同变量的交叉表 - 反映在对角线上

问题描述

我有一个数据集,我对不同对出现的频率感兴趣,但元素出现的顺序并不重要。例如:

library(janitor)

set.seed(24601)

options <- c("a", "b", "c", "d", "e", "f")

data.frame(x = sample(options, 20, replace = TRUE),
           y = sample(options, 20, replace = TRUE)) %>% 
  tabyl(x, y)

为我提供输出

 x a b c d e f
 a 1 0 1 0 1 0
 b 0 2 0 1 0 0
 c 2 0 1 0 0 0
 d 0 0 0 0 1 0
 e 1 1 2 0 0 3
 f 0 0 1 1 0 1

理想情况下,我会在此表的右上角或左下角,其中值ac的总和为 3。这是 1(右上角)和 2(左中)的总和. 以此类推,对于彼此的一对值。

我确信必须有一个简单的方法来做到这一点,但我无法弄清楚它是什么......

编辑添加(感谢@Akrun 的请求):理想情况下,我想要以下输出


x a b c d e f
a 1 0 3 0 2 0
b   2 0 1 1 0
c     1 0 2 1
d       0 1 1
e         0 3
f           1

标签: r

解决方案


我们可以+使用转t置的输出(第一列除外),然后用相应的元素替换“out”对象上三角形值(基于upper.tri- 返回逻辑向量的元素子集),并将下三角形元素分配给 NA

out2 <- out[-1] + t(out[-1])
out[-1][upper.tri(out[-1])] <- out2[upper.tri(out2)]
out[-1][lower.tri(out[-1])] <- NA

-输出

out
# x  a  b  c  d  e f
# a  1  0  3  0  2 0
# b NA  2  0  1  1 0
# c NA NA  1  0  2 1
# d NA NA NA  0  1 1
# e NA NA NA NA  0 3
# f NA NA NA NA NA 1

数据

set.seed(24601)
options <- c("a", "b", "c", "d", "e", "f")
out <- data.frame(x = sample(options, 20, replace = TRUE),
           y = sample(options, 20, replace = TRUE)) %>% 
  tabyl(x, y)

推荐阅读