r - 为每对二进制变量创建一个单元格计数最低的矩阵

标签 r dplyr purrr missing-data crosstab

我有一个包含多个二进制变量(x1-x5,值:1、2、NA)的数据集。我的目标是确定交叉表中的二进制变量对是否具有零或非常低的单元格计数(在忽略缺失值之后)。因此,我想为我的数据集中的每一对二进制变量计算交叉表,从每个表中提取最低值,并将每个交叉表中的最低值报告到矩阵中。通过这样做,我将得到类似于相关矩阵的东西,而不是相关系数,我将能够查看每对变量的最低单元格计数。下面我为任何决定提供帮助的人创建了一个玩具数据集。

library(tidyverse)
    
df <- data.frame(x1 = rbinom(n = 1000, size = 1, prob = 0.5),
                     x2 = rbinom(n = 1000, size = 1, prob = 0.3),
                     x3 = rbinom(n = 1000, size = 1, prob = 0.4),
                     x4 = rbinom(n = 1000, size = 1, prob = 0.2),
                     x5 = rbinom(n = 1000, size = 1, prob = 0.05)) |> 
      mutate(across(everything(), ~as.factor(.))) |> 
      mutate(across(everything(), ~recode(., "1" = "2", "0" = "1")))
    
df1 <- as.data.frame(lapply(df, function(cc) cc[ sample(c(TRUE, NA), prob = c(0.85, 0.15), size = length(cc), replace = TRUE) ]))

最佳答案

认为这就是你的意思。它效率低下(我们应该只计算一个三角形)但很短。

cfun <- function(i, j) {
   min(table(df[[i]], df[[j]]))
}
outer(1:ncol(df), 1:ncol(df), Vectorize(cfun))

如果你想更有效率:

n <- ncol(df)
m <- matrix(NA_integer_, n, n, dimnames = list(names(df), names(df)))
for (i in 1:(n-1)) {
   for (j in (i+1):n) {
      m[j,i] <- cfun(i,j)
   }
}

关于r - 为每对二进制变量创建一个单元格计数最低的矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73028171/

相关文章:

r - curve() 在第一个示例中有效,但在第二个示例中无效,但它们看起来相同。为什么?

r - 从列表中的所有矩阵中获取最大值

r - 从 R markdown 内联代码中的 tibble 中提取值

r - 查找两个数据框中的共同条目

r - 如何根据一个值过滤远程表?

r - 无法将类 ‘c("fseq", "function")’ 强制转换为 data.frame

r - R 中的重复数据删除和延长数据帧

r - 将 lm 与 map2 一起应用

根据首次发病对数据进行排名

r - RStudio 和 RServe 之间有什么关系?