我有一个缺少值的数据框。有几组列通过相同行上的值连接在一起,从而形成块:
块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中自动创建变量“ Block”以指示已连接的组?
答案 0 :(得分:1)
删除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"