R - 创建具有相同值频率的变量矩阵

R - Create a Matrix of Variables with the frequency of same values

我在 R 中遇到了一个我自己无法处理的问题。

我有一个看起来像这样的数据框,其中包含更多变量和案例:

ID      Var1   Var2   Var3   Var4
1          1      0      1      1
2          0      0      0      0
3          1      1      1      1
4          1      1      0      1
5          1      0      1      0

我喜欢 - 类似于相关矩阵 - 一个显示一对变量具有相同值的频率的矩阵 - 例如值“1”。上面 df 的结果矩阵应该是这样的。

           Var1   Var2   Var3   Var4
Var1                2      3      3
Var2                       1      2
Var3                              2
Var4                              

也许你能帮上忙。提前谢谢你。

首先创建一个评估数据矩阵来测试你的价值,这里是1。

e <- d[-1] == 1  ## value to test

然后使用 outerFUN 函数横向比较列 sum 两个 TRUE 总和为 [=16= 的频率].从 result 你显然想删除 lower.tri 包括 diagonal.

FUN <- Vectorize(function(i, j) sum(e[,i] + e[,j] == 2))
(res <- t(outer(1:ncol(e), 1:ncol(e), FUN)))
res[lower.tri(res, diag=1)] <- NA
res
#      [,1] [,2] [,3] [,4]
# [1,]   NA    2    3    3
# [2,]   NA   NA    1    2
# [3,]   NA   NA   NA    2
# [4,]   NA   NA   NA   NA

您可以像下面那样尝试crossprod

replace(m <- crossprod(as.matrix(df[-1])), lower.tri(m, diag = TRUE), NA)

这给出了

     Var1 Var2 Var3 Var4
Var1   NA    2    3    3
Var2   NA   NA    1    2
Var3   NA   NA   NA    2
Var4   NA   NA   NA   NA

数据

> dput(df)
structure(list(ID = 1:5, Var1 = c(1L, 0L, 1L, 1L, 1L), Var2 = c(0L,
0L, 1L, 1L, 0L), Var3 = c(1L, 0L, 1L, 0L, 1L), Var4 = c(1L, 0L, 
1L, 1L, 0L)), class = "data.frame", row.names = c(NA, -5L))