r - 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
理想情况下,我会在此表的右上角或左下角,其中值a和c的总和为 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
解决方案
我们可以+
使用转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)
推荐阅读
- amazon-web-services - 是否可以将功能/特定文件从一个 Amazon Connect 实例导入/迁移到另一个实例?
- android - 即使我在环境变量中输入了android sdk的路径,谁能解释一下
- javascript - 简单的任务列表排序 - 如何将其保存到 Firebase Firestore?
- php - 在 mcrypt 上使用谜
- python - 将每个索引的编号放在numpy的对应位置
- elasticsearch - 查询多个索引时,仅检索弹性搜索命中中的特定 _index 文档
- java - 使用杰克逊转换带有重复键的 JSON
- wordpress - 如何在使用 WP 加载页面期间阻止外部静态资源
- java - 如何测试 AOP 拦截器?
- c++ - cmake生成的执行文件使用gdb失败