我有六个数据框,其中一些包含相同的结构和值,但有些则不同。 我在循环函数中使用
identical()
比较了这些数据帧的所有组合,并在下表中总结了比较结果。
result <- data.frame(source=c(1,1,1,1,1,2,2,2,2,3,3,3,4,4,5), dest=c(2,3,4,5,6,3,4,5,6,4,5,6,5,6,6), TF=c("T","F","F","F","F","T","F","F","F","F","F","F","T","F","F"))
> result
source dest TF
1 1 2 T
2 1 3 F
3 1 4 F
4 1 5 F
5 1 6 F
6 2 3 T
7 2 4 F
8 2 5 F
9 2 6 F
10 3 4 F
11 3 5 F
12 3 6 F
13 4 5 T
14 4 6 F
15 5 6 F
sourece
和dest
是五个数据框的组合列表。 TF
存储这两个数据帧是否相同。
例如,数据帧1和2相同,那么2和3也相同。因此,数据帧 1、2 和 3 是相同的,然后将给出唯一的组 id。 接下来,数据帧4和5是相同的数据帧。因此这些数据帧将有另一个组 ID。数据帧6没有任何相同的数据帧,因此这将具有另一个组id。这将返回下表。
> group_id
dfID, GroupID
1 1
2 1
3 1
4 2
5 2
6 3
有什么想法可以将
result
表转换为 group_id
吗?
挑战是如何定义具有 T 的数据帧之间的连接/链,这些数据帧在 source
或 dest
中共享相同的数据帧编号,以便我们可以识别组。一旦确定了组,我们就可以简单地给出从第一组到最后一组的连续编号。另一个挑战是可能存在几个与其他数据帧不相同的独特数据帧。我们还需要为他们添加唯一的组 ID。
使用 igraph,获取 TF 为 T 的行的成员资格:
library(igraph)
ix <- result$TF == "T"
g <- graph_from_data_frame(result[ ix, ])
plot(g)
cm <- components(g)$membership
cm
# 1 2 4 3 5
# 1 1 2 1 2
result$grp[ ix ] <- cm[ as.character(result$source[ ix ]) ]
result[ ix, ]
# source dest TF grp
# 1 1 2 T 1
# 6 2 3 T 1
# 13 4 5 T 2
您可以使用
subgraph.edges
和 components
以及 membership
来制作
library(igraph)
result %>%
graph_from_data_frame() %>%
subgraph.edges(which(E(.)$TF == "T"), delete.vertices = FALSE) %>%
components() %>%
membership() %>%
stack() %>%
rev() %>%
setNames(c("dfID", "GroupID")) %>%
type.convert(as.is = TRUE)
给出类似的输出
dfID GroupID
1 1 1
2 2 1
3 3 1
4 4 2
5 5 2
6 6 3