跨不同的数据框行收集连接的ID [英] Gather connected IDs across different rows of data frame
本文介绍了跨不同的数据框行收集连接的ID的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
给定如下R数据框:
DF.a <- data.frame(ID1 = c("A","B","C","D","E","F","G","H"),
ID2 = c("D",NA,"G",NA,NA,NA,"H",NA),
ID3 = c("F",NA,NA,NA,NA,NA,NA,NA))
> DF.a
ID1 ID2 ID3
1 A D F
2 B <NA> <NA>
3 C G <NA>
4 D <NA> <NA>
5 E <NA> <NA>
6 F <NA> <NA>
7 G H <NA>
8 H <NA> <NA>
我想将其简化/重塑为以下内容:
DF.b <- data.frame(ID1 = c("A","B","C","E"),
ID2 = c("D",NA,"G",NA),
ID3 = c("F",NA,"H",NA))
> DF.b
ID1 ID2 ID3
1 A D F
2 B <NA> <NA>
3 C G H
4 E <NA> <NA>
这看起来不像是一次直接的重塑。这样做的目的是将所有"连接的"ID值放在一行中。注意"C"和"H"之间的连接是间接的,因为两者都连接到"G",但它们不会一起出现在DF.a的同一行。ID值在DF.b行中的顺序无关紧要。
推荐答案
实际上,您可以将其视为尝试获取图的所有连接组件。我要采取的第一步是将数据转换为更自然的结构--节点向量和边矩阵:
(nodes <- as.character(sort(unique(unlist(DF.a)))))
# [1] "A" "B" "C" "D" "E" "F" "G" "H"
(edges <- do.call(rbind, apply(DF.a, 1, function(x) {
x <- x[!is.na(x)]
cbind(head(x, -1), tail(x, -1))
})))
# [,1] [,2]
# ID1 "A" "D"
# ID2 "D" "F"
# ID1 "C" "G"
# ID1 "G" "H"
现在您可以构建图表并计算其组件:
library(igraph)
g <- graph.data.frame(edges, FALSE, nodes)
(comp <- split(nodes, components(g)$membership))
# $`1`
# [1] "A" "D" "F"
#
# $`2`
# [1] "B"
#
# $`3`
# [1] "C" "G" "H"
#
# $`4`
# [1] "E"
split
函数的输出是一个列表,其中每个列表元素都是图的一个组件中的所有节点。就我个人而言,我认为这是输出数据最有用的表示形式,但如果您真的想要所描述的NA填充结构,可以尝试如下所示:
max.len <- max(sapply(comp, length))
do.call(rbind, lapply(comp, function(x) { length(x) <- max.len ; x }))
# [,1] [,2] [,3]
# 1 "A" "D" "F"
# 2 "B" NA NA
# 3 "C" "G" "H"
# 4 "E" NA NA
这篇关于跨不同的数据框行收集连接的ID的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文