跨不同的数据框行收集连接的ID [英] Gather connected IDs across different rows of data frame

查看:10
本文介绍了跨不同的数据框行收集连接的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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆