首页 > 解决方案 > 共同出现的变量对的交叉表

问题描述

我有一个数据框,其中的列代表一些变量。每行对应一个实例。在给定实例中存在特定变量用 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

谢谢你。

标签: rdplyr

解决方案


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

推荐阅读