我有一个数据框,其中包含代表一些变量的列。每行对应一个实例。给定实例中特定变量的存在由 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
谢谢。
最佳答案
由于列是二进制 1 或 0,您也可以通过将列相乘来实现此目的,只有当两列都等于 1 时,结果才为 1,然后求和
out <- sapply(df, function(x) colSums(df*x))
diag(out) <- NA
out
# 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
或者使用矩阵乘法
out <- t(df) %*% as.matrix(df)
diag(out) <- NA
out
# 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 - 共现变量对的交叉制表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57869831/