0

@Aniko 指出,查看我的问题的一种方法是,我需要找到图的连通分量,其中顶点称为组和变量group,并nominated_group表示这两个组之间的边。我的目标是创建一个parent_Group索引连接组件的变量。或者正如我之前所说:

我有一个包含四个变量的数据框:IDgroup、 和nominated_ID、 和nominated_Group

考虑姊妹组:如果数据中至少有一个案例 group==A 且指定组==B,则 A 组和 B 组是姊妹组,反之亦然。

我想创建一个变量parent_group,它对每组姐妹组都具有唯一值。换句话说,不同parent_groups的案件之间不应出现提名。制作parent_group序列号似乎是个好主意。

非常感谢我在这里收到的帮助!我不能在这里真正做出贡献,但请注意,我尝试在 stats.exchange 和 wikipedia 上支付它。

在我的假数据中,A 和 B 是姐妹组。无论是 ID=4 还是 ID=5 都足以证明这一点。每个小组也是他们自己的姐妹小组。的目标,即 的创建parent_group,应该parent_group为 A 或 B 中的所有案例产生一个,而parent_group对于 C 组的另一个案例

df <- data.frame(ID = c(9, 5, 2, 4, 3, 7), 
  group = c("A", "A", "B", "B", "A", "C"),
  nominated_ID = c(9, 8, 4, 9, 2, 7)     )

df$nominated_group <- with(df, group[match(nominated_ID, ID)])

df

  ID group nominated_ID nominated_group
1  9     A            9               A
2  5     A            8            <NA>
3  2     B            4               B
4  4     B            9               A
5  3     A            2               B
6  7     C            7               C
4

1 回答 1

3

考虑一个以组为顶点的图,边表示两个组出现在相同的 ID 上。然后我认为您正在寻找该图的连接组件。以下是使用该graph包的这个想法的快速而肮脏的(可能不是最佳的)实现:

library(graph)
#make some fake data
nom <- data.frame(group = c("A","A","A","B","B","C","C"),
                  group2 = c("A","A","B","B","A","C","C"),
            stringsAsFactors=FALSE)
#remove duplicated pairs
#it will keep A-B distinct from B-A, could probably be fixed
nom1 <- nom[!duplicated(nom),]

#define empty graph
grps <- union(unique(nom$group), unique(nom$group2))
gg <- new("graphNEL", nodes=grps, edgeL=list())
#add an edge for every pair
for (i in 1:nrow(nom1)) gg <- addEdge(nom1$group[i], nom1$group2[i], gg, 1)

#find connected components
cc <- connComp(gg)

#assing parent by matching within cc
nom$parent <- apply(nom, 1, 
    function(x) which(sapply(cc, function(y) x["group"] %in% y)))
nom

  group group2 parent
1     A      A      1
2     A      A      1
3     A      B      1
4     B      B      1
5     B      A      1
6     C      C      2
7     C      C      2
于 2011-05-10T21:03:05.333 回答