为R中的数据帧对生成组id

问题描述 投票:0回答:2

我有六个数据框,其中一些包含相同的结构和值,但有些则不同。 我在循环函数中使用

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。

r grouping igraph pairing
2个回答
0
投票

使用 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
投票

您可以使用

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
© www.soinside.com 2019 - 2024. All rights reserved.