0

@Anikoは、私の問題を表示する1つの方法は、頂点がグループおよび変数groupと呼ばれnominated_group、これら2つのグループ間のエッジを示すグラフの連結成分を見つける必要があることを指摘しています。parent_Group私の目標は、連結成分にインデックスを付ける変数を作成することです。または私が前にそれを置いたように:

、、、、、およびの4つの変数を持つデータフレームがIDあります。 groupnominated_IDnominated_Group

姉妹グループについて考えてみましょう。データにgroup==Aとnomination_group==Bのケースが少なくとも1つある場合、またはその逆の場合、グループAとBは姉妹グループです。

parent_group姉妹グループのセットごとに一意の値をとる変数を作成したいと思います。言い換えれば、異なるparent_groupsのケース間で指名が行われるべきではありません。連番を作るのparent_groupは良い考えのようです。

私がすでにここで受けた助けに感謝します!ここでは実際に貢献することはできませんが、stats.exchangeとウィキペディアで前払いしようとしていることに注意してください。

私の偽のデータでは、AとBは姉妹グループです。これを実現するには、ID=4またはID=5のいずれの場合でも十分です。各グループは、独自の姉妹グループでもあります。目標であるの作成は、 AまたはBのすべてのケースで1つ、グループCでもうparent_group1つになるはずです。parent_groupparent_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
4

1 に答える 1

3

グループを頂点とし、エッジが2つのグループが同じ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 に答える