在R

时间:2019-05-11 13:34:22

标签: r dataframe split missing-data

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

块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”以指示已连接的组?

1 个答案:

答案 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"