提问人:HSJ 提问时间:11/14/2023 最后编辑:ThomasIsCodingHSJ 更新时间:11/14/2023 访问量:49
在 R 中为数据帧对生成组 ID [duplicate]
Generating group id for pairs of data frames in R [duplicate]
问:
我有六个数据框,其中一些包含相同的结构和值,但有些则不然。
我使用循环函数比较了这些数据帧的所有组合,并在下表中总结了比较结果。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
有什么想法可以把桌子凑进去吗?
挑战在于如何定义具有 T 的数据帧之间的连接/链,这些 T 在或以便我们可以识别组中共享相同的数据帧编号。一旦确定了组,我们就可以简单地给出从第一组到最后一组的序列号。另一个挑战是,可能存在多个与其他数据帧不完全相同的唯一数据帧。我们还需要为他们添加唯一的组 ID。result
group_id
source
dest
答:
2赞
zx8754
11/14/2023
#1
使用 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
0赞
ThomasIsCoding
11/14/2023
#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
评论