【问题标题】:Finding blocks of connected columns of a data frame automatically in R在R中自动查找数据框的连接列块
【发布时间】:2019-05-11 13:34:21
【问题描述】:

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

块 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”?

【问题讨论】:

  • 这个问题不清楚,具体你所说的“指示连接的组”是什么意思?您的意思是一个变量,它告诉您哪些列组没有缺失?
  • 你能解释一下第一行的输出吗?为什么是X1 X2 X3

标签: r dataframe split missing-data


【解决方案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"   

【讨论】:

    猜你喜欢
    • 2021-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-20
    • 1970-01-01
    • 1970-01-01
    • 2014-02-12
    • 1970-01-01
    相关资源
    最近更新 更多