group
和nominated_group
表示边这两个群体之间。我的目标是创建一个变量parent_Group
,为连接的组件编制索引。或者像我之前说的那样:
我有一个包含四个变量的数据框:ID
,group
,nominated_ID
和nominated_Group
。
考虑姐妹群体:如果数据中至少有一个案例,其中group == A和nominated_group == B,则A组和B组是姐妹组。反之亦然。
我想创建一个变量parent_group
,它为每组姐妹组提供一个唯一值。换句话说,在不同parent_group
s的案例之间不应该出现提名。制作parent_group
连续数字似乎是一个好主意。
非常感谢我已经收到的帮助here!我不能在这里做出贡献,但请注意我尝试在stats.exchange和维基百科上付款。
在我的假数据中,A和B是姊妹组。无论是ID = 4还是ID = 5都足以使其成为现实。每个小组也是他们自己的姐妹小组。创建parent_group
的目标应该为A或B中的所有案例生成一个parent_group
,为C组生成另一个parent_group
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
答案 0 :(得分: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