在 R 中为数据帧对生成组 ID [duplicate]

Generating group id for pairs of data frames in R [duplicate]

提问人:HSJ 提问时间:11/14/2023 最后编辑:ThomasIsCodingHSJ 更新时间:11/14/2023 访问量:49

问:

我有六个数据框,其中一些包含相同的结构和值,但有些则不然。 我使用循环函数比较了这些数据帧的所有组合,并在下表中总结了比较结果。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并且是五个数据框的组合列表。 存储这两个数据框是否相同。destTF

例如,数据框 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

有什么想法可以把桌子凑进去吗? 挑战在于如何定义具有 T 的数据帧之间的连接/链,这些 T 在或以便我们可以识别组中共享相同的数据帧编号。一旦确定了组,我们就可以简单地给出从第一组到最后一组的序列号。另一个挑战是,可能存在多个与其他数据帧不完全相同的唯一数据帧。我们还需要为他们添加唯一的组 ID。resultgroup_idsourcedest

R 分组 iGraph 配对

评论


答:

2赞 zx8754 11/14/2023 #1

使用 igraph,获取 TF 为 T 的行的成员资格:

library(igraph)

ix <- result$TF == "T"
g <- graph_from_data_frame(result[ ix, ])
plot(g)

enter image description here

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
0赞 ThomasIsCoding 11/14/2023 #2

您可以使用 和 一起制作它subgraph.edgescomponentsmembership

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