首页 > 解决方案 > 在R中自动查找数据框的连接列块

问题描述

我有一个缺少值的数据框。有一组列通过相同行上的值连接,从而形成块:

块 1:变量“X1”、“X2”和“X3”/块 2:变量“X4”和“X5”/块 3:变量“X6”

x <- data.frame(matrix(NA, nrow = 5, ncol=7))

colnames(x)[7] <- "Block"

x[1, c("X1", "X2")] <- 7

x[2, c("X1", "X3")] <- 7

x[3, c("X4", "X5")] <- 7

x[4, c("X4")] <- 7

x[5, c("X6")] <- 7

x$Block[1:2] <- c(paste("X1", "X2", "X3"))

x$Block[3:4] <- c(paste("X4", "X5"))

x$Block[5] <- c(paste("X6"))

如何在 R 中自动创建指示连接组的变量“块”?

标签: rdataframesplitmissing-data

解决方案


删除最后一列x并转换为非 NA 时为 TRUE 的逻辑矩阵。从中创建一个关联矩阵inc并从中创建一个图g。计算连通分量grps。这将包含重复项,因此从中计算唯一的连接组件u。然后为每一行ok找到对应于条目的列名nms,并将其与u给出的结果相匹配。

library(igraph)

nc <- ncol(x) - 1
ok <- !is.na(x[, 1:nc])

inc <- sign(crossprod(as.matrix(ok)))
g <- graph_from_incidence_matrix(inc - diag(nc))
# plot(g)

grps <- groups(components(g))
u <- unique(lapply(grps, sort))
nms <- apply(ok, 1, function(x) colnames(ok)[x])
sapply(u, toString)[sapply(nms, function(x) which(lengths(lapply(u, intersect, x)) > 0))]
## [1] "X1, X2, X3" "X1, X2, X3" "X4, X5"     "X4, X5"     "X6"   

推荐阅读