r - 共同出现的变量对的交叉表
问题描述
我有一个数据框,其中的列代表一些变量。每行对应一个实例。在给定实例中存在特定变量用 1 表示,不存在则用 0 表示。
# Construct dataframe.
df <- structure(list(var.1 = c(0, 1, 0, 0, 0, 1, 0),
var.2 = c(1, 1, 0, 0, 1, 0, 0),
var.3 = c(1, 1, 0, 1, 0, 0, 1),
var.4 = c(0, 0, 0, 1, 1, 1, 1)),
class = "data.frame", row.names = c(NA, -7L))
> df
# var.1 var.2 var.3 var.4
# 1 0 1 1 0
# 2 1 1 1 0
# 3 0 0 0 0
# 4 0 0 1 1
# 5 0 1 0 1
# 6 1 0 0 1
# 7 0 0 1 1
我想知道如何,最好使用dplyr
,创建一个矩阵来计算所有变量对之间的共现频率。结果应如下所示:
> result.df
# var.1 var.2 var.3 var.4
# var.1 NA 1 0 0
# var.2 1 NA 2 1
# var.3 0 2 NA 2
# var.4 1 1 2 NA
谢谢你。
解决方案
df
是一个矩阵。在基数 R 中,我们可以使用outer
并计算每 2 列中 1 的共现次数。
count_1s <- function(x, y) sum(df[, x] == 1 & df[, y] == 1)
mat <- outer(seq_len(ncol(df)), seq_len(ncol(df)), Vectorize(count_1s))
diag(mat) <- NA
dimnames(mat) <- list(colnames(df), colnames(df))
# var.1 var.2 var.3 var.4
#var.1 NA 1 1 1
#var.2 1 NA 2 1
#var.3 1 2 NA 2
#var.4 1 1 2 NA
推荐阅读
- r - R中函数内的子集疑难解答
- ruby-on-rails - Rspec 规格控制器
- java - 方法参考:新的位置
- r - 无法识别的内容编码类型
- python - 使用 tf.data 批量处理顺序数据
- python - 如何从python中的文件中获取某些单词或字符串的出现次数
- networking - 无法使用 ssh 连接,但打开的 ssh 客户端仍然可以工作
- android - 如何从android中观察者的onComplete中做出意图?
- blockchain - bigchaindb 的用例 - bigchaindb 如何去中心化?
- java - 尝试在 Raspberry Pi 上运行 Arduino IDE 时出错