如何在R中生成多列交叉表,计算列取1的组合出现次数?
在R中生成指定交叉表的简便方法
首先构造示例数据集:
x <- data.frame( client_id = 1:4, a = c(1, 0, 0, 1), b = c(0, 1, 0, 1), c = c(0, 1, 1, 1) )
实现步骤:
- 提取需要计算的目标列(排除
client_id):
cols <- x[, c("a", "b", "c")]
- 快速计算两两列同时为1的次数(初始矩阵的对角线为各列1的总次数):
cross_matrix <- t(as.matrix(cols)) %*% as.matrix(cols)
- 计算仅当前列为1的次数(用于替换对角线):
diag_values <- sapply(colnames(cols), function(col) { # 当前列取1,且其他所有列都取0的行数 sum(cols[[col]] == 1 & rowSums(cols[, setdiff(colnames(cols), col)]) == 0) })
- 替换矩阵对角线,得到最终结果:
diag(cross_matrix) <- diag_values cross_matrix
运行后输出结果:
a b c a 1 1 1 b 1 0 2 c 1 2 1
逻辑说明:
- 矩阵乘法
t(as.matrix(cols)) %*% as.matrix(cols)是高效统计两列同时为1行数的方式,非对角线值直接满足需求。 - 对角线需要单独计算,因为初始矩阵的对角线是该列所有1的总次数,而我们需要的是仅该列取1的次数,通过判断其他列是否全为0来实现。
内容的提问来源于stack exchange,提问作者GitZine
相关产品推荐
相关产品推荐

