Поиск блоков связанных столбцов кадра данных автоматически в R - PullRequest
0 голосов
/ 11 мая 2019

У меня есть фрейм данных с пропущенными значениями. Существуют группы столбцов, которые связаны значениями в тех же строках и, таким образом, образуют блоки:

Блок 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?

1 Ответ

1 голос
/ 11 мая 2019

Удалить последний столбец x и преобразовать в логическую матрицу, которая имеет значение ИСТИНА, когда нет NA.Из этого создайте матрицу инцидентности 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"   
...