我有一个包含多个二进制变量(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/