r - 在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 中自动创建指示连接组的变量“块”?
解决方案
删除最后一列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"
推荐阅读
- logging - 尝试提取 GNU Octave 软件的提交日志
- javascript - 如何在 IE11 上更改 YandexMaps 上按钮的类名?
- ssl - 使用 TLS 验证 MQTT 代理时出现问题
- python - 如何在网页上训练我自己的自定义词嵌入?
- go - 所有的 goroutine 都在休眠 - 死锁!与等待组
- excel - 如何选择文件并将文件路径粘贴到嵌入的文本框中?
- python - 如何将来自 Active Directory 的图像数组转换为 Python 以保存在驱动器中?
- permissions - 有没有办法让 wagtail modeladmin 中每个用户的数据可见?
- php - Swiftmailer 不向 yahoo.com 或 icloud.com 发送电子邮件
- apache-flink - org.apache.flink.table.api.TableException: 结果的 Arity [3] 与请求类型的 number[2] 不匹配