R中的简单数据操作

时间:2011-05-10 19:03:32

标签: r vectorization data-manipulation

@Aniko指出,查看我的问题的一种方法是我需要找到图的连通分量,其中顶点称为组,变量groupnominated_group表示边这两个群体之间。我的目标是创建一个变量parent_Group,为连接的组件编制索引。或者像我之前说的那样:

我有一个包含四个变量的数据框:IDgroupnominated_IDnominated_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

1 个答案:

答案 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